@greatapps/greatagents-ui 0.3.24 → 0.3.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +174 -152
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/agents/agent-tools-list.tsx +17 -17
- package/src/components/tools/tool-form-dialog.tsx +137 -135
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/index.ts","../src/lib/index.ts","../src/hooks/types.ts","../src/hooks/use-agents.ts","../src/hooks/use-tools.ts","../src/hooks/use-objectives.ts","../src/hooks/use-agent-tools.ts","../src/hooks/use-conversations.ts","../src/hooks/use-settings.ts","../src/hooks/use-contacts.ts","../src/hooks/use-capabilities.ts","../src/hooks/use-integrations.ts","../src/data/integrations-registry.ts","../src/components/agents/agents-table.tsx","../src/components/agents/agent-form-dialog.tsx","../src/components/agents/agent-edit-form.tsx","../src/components/agents/agent-objectives-list.tsx","../src/components/ui/sortable.tsx","../src/lib/compose-refs.ts","../src/components/agents/conversation-flow-editor.tsx","../src/components/agents/agent-definition-editor.tsx","../src/components/agents/agent-revision-tab.tsx","../src/components/conversations/agent-conversations-table.tsx","../src/components/conversations/conversation-view.tsx","../src/components/conversations/agent-conversations-panel.tsx","../src/components/capabilities/capabilities-tab.tsx","../src/components/capabilities/integrations-tab.tsx","../src/components/agents/agent-tabs.tsx","../src/components/agents/agent-tools-list.tsx","../src/components/tools/tools-table.tsx","../src/components/tools/tool-form-dialog.tsx","../src/components/tools/tool-credentials-form.tsx","../src/components/capabilities/integration-card.tsx","../src/components/capabilities/advanced-tab.tsx","../src/components/capabilities/integration-wizard.tsx","../src/components/capabilities/wizard-steps/info-step.tsx","../src/components/capabilities/wizard-steps/credentials-step.tsx","../src/components/capabilities/wizard-steps/config-step.tsx","../src/components/capabilities/wizard-steps/confirm-step.tsx","../src/pages/agents-page.tsx","../src/pages/agent-detail-page.tsx","../src/pages/agent-capabilities-page.tsx","../src/pages/tools-page.tsx","../src/pages/credentials-page.tsx","../src/pages/integrations-management-page.tsx"],"sourcesContent":["import type {\n ApiResponse,\n Agent,\n AgentTool,\n AvailabilityResult,\n CalendarStatus,\n ContactUser,\n Conversation,\n GagentsContact,\n Objective,\n PromptVersion,\n Tool,\n ToolCredential,\n} from \"../types\";\nimport type { AgentCapability, AgentCapabilitiesPayload, CapabilitiesResponse } from \"../types/capabilities\";\n\nexport interface GagentsClientConfig {\n baseUrl: string;\n token: string;\n language?: string;\n idWl?: number;\n}\n\nexport function createGagentsClient(config: GagentsClientConfig) {\n const { baseUrl, token, language = \"pt-br\", idWl = 1 } = config;\n\n function buildUrl(idAccount: number, path: string): string {\n return `${baseUrl}/v1/${language}/${idWl}/accounts/${idAccount}/${path}`;\n }\n\n async function request<T>(\n method: string,\n idAccount: number,\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ApiResponse<T>> {\n const url = new URL(buildUrl(idAccount, path));\n if (params) {\n Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let message = `HTTP ${res.status}: ${res.statusText}`;\n try {\n const errorBody = await res.json();\n message = errorBody.message || message;\n } catch {\n /* ignore parse errors */\n }\n throw new Error(message);\n }\n\n const json: ApiResponse<T> = await res.json();\n\n // For mutations, treat API-level failures as errors so TanStack Query\n // fires onError instead of onSuccess (API returns HTTP 200 even on failure)\n if (method !== \"GET\" && json.status === 0) {\n throw new Error(json.message || \"Operação falhou\");\n }\n\n return json;\n }\n\n return {\n // --- Agents ---\n listAgents: (idAccount: number, params?: Record<string, string>) =>\n request<Agent[]>(\"GET\", idAccount, \"agents\", undefined, params),\n\n getAgent: (idAccount: number, id: number) =>\n request<Agent>(\"GET\", idAccount, `agents/${id}`),\n\n createAgent: (\n idAccount: number,\n body: Pick<Agent, \"title\"> &\n Partial<Pick<Agent, \"photo\" | \"delay_typing\" | \"waiting_time\">>,\n ) => request<Agent>(\"POST\", idAccount, \"agents\", body),\n\n updateAgent: (\n idAccount: number,\n id: number,\n body: Partial<\n Pick<Agent, \"title\" | \"photo\" | \"delay_typing\" | \"waiting_time\" | \"active\" | \"identity\" | \"mission\" | \"tone_style_format\" | \"rules\" | \"conversation_flow\" | \"context\">\n > & { change_notes?: string },\n ) => request<Agent>(\"PUT\", idAccount, `agents/${id}`, body),\n\n deleteAgent: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `agents/${id}`),\n\n // --- Tools ---\n listTools: (idAccount: number, params?: Record<string, string>) =>\n request<Tool[]>(\"GET\", idAccount, \"tools\", undefined, params),\n\n getTool: (idAccount: number, id: number) =>\n request<Tool>(\"GET\", idAccount, `tools/${id}`),\n\n createTool: (\n idAccount: number,\n body: Pick<Tool, \"name\" | \"type\"> &\n Partial<Pick<Tool, \"slug\" | \"description\" | \"auth_config\" | \"function_definitions\">>,\n ) => request<Tool>(\"POST\", idAccount, \"tools\", body),\n\n updateTool: (\n idAccount: number,\n id: number,\n body: Partial<\n Pick<Tool, \"name\" | \"slug\" | \"type\" | \"description\" | \"auth_config\" | \"function_definitions\">\n >,\n ) => request<Tool>(\"PUT\", idAccount, `tools/${id}`, body),\n\n deleteTool: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `tools/${id}`),\n\n // --- Agent Tools ---\n listAgentTools: (idAccount: number, idAgent: number, params?: Record<string, string>) =>\n request<AgentTool[]>(\"GET\", idAccount, `agents/${idAgent}/tools`, undefined, params),\n\n addAgentTool: (\n idAccount: number,\n idAgent: number,\n body: Pick<AgentTool, \"id_tool\"> &\n Partial<Pick<AgentTool, \"enabled\" | \"custom_instructions\" | \"parameter_mappings\" | \"id_tool_credential\">>,\n ) => request<AgentTool>(\"POST\", idAccount, `agents/${idAgent}/tools`, body),\n\n updateAgentTool: (\n idAccount: number,\n idAgent: number,\n id: number,\n body: Partial<\n Pick<AgentTool, \"enabled\" | \"custom_instructions\" | \"parameter_mappings\" | \"id_tool_credential\">\n >,\n ) => request<AgentTool>(\"PUT\", idAccount, `agents/${idAgent}/tools/${id}`, body),\n\n removeAgentTool: (idAccount: number, idAgent: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `agents/${idAgent}/tools/${id}`),\n\n // --- Objectives ---\n listObjectives: (idAccount: number, idAgent: number, params?: Record<string, string>) =>\n request<Objective[]>(\"GET\", idAccount, `agents/${idAgent}/objectives`, undefined, params),\n\n getObjective: (idAccount: number, idAgent: number, id: number) =>\n request<Objective>(\"GET\", idAccount, `agents/${idAgent}/objectives/${id}`),\n\n createObjective: (\n idAccount: number,\n idAgent: number,\n body: Pick<Objective, \"title\"> &\n Partial<Pick<Objective, \"slug\" | \"instruction\" | \"description\" | \"conversation_flow\" | \"rules\" | \"order\" | \"active\">>,\n ) => request<Objective>(\"POST\", idAccount, `agents/${idAgent}/objectives`, body),\n\n updateObjective: (\n idAccount: number,\n idAgent: number,\n id: number,\n body: Partial<Pick<Objective, \"title\" | \"slug\" | \"instruction\" | \"description\" | \"conversation_flow\" | \"rules\" | \"order\" | \"active\">>,\n ) => request<Objective>(\"PUT\", idAccount, `agents/${idAgent}/objectives/${id}`, body),\n\n deleteObjective: (idAccount: number, idAgent: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `agents/${idAgent}/objectives/${id}`),\n\n // --- Conversations ---\n listConversations: (idAccount: number, params?: Record<string, string>) =>\n request<Conversation[]>(\"GET\", idAccount, \"conversations\", undefined, params),\n\n listAgentConversations: (idAccount: number, idAgent: number, params?: Record<string, string>) =>\n request<Conversation[]>(\"GET\", idAccount, `agents/${idAgent}/conversations`, undefined, params),\n\n getConversation: (idAccount: number, id: number) =>\n request<Conversation>(\"GET\", idAccount, `conversations/${id}`),\n\n // --- Prompt Versions ---\n listPromptVersions: (idAccount: number, idAgent: number, params?: Record<string, string>) =>\n request<PromptVersion[]>(\"GET\", idAccount, `agents/${idAgent}/prompt-versions`, undefined, params),\n\n // --- Tool Credentials ---\n listToolCredentials: (idAccount: number, params?: Record<string, string>) =>\n request<ToolCredential[]>(\"GET\", idAccount, \"tool-credentials\", undefined, params),\n\n createToolCredential: (\n idAccount: number,\n body: Pick<ToolCredential, \"id_tool\" | \"label\" | \"credentials_encrypted\"> &\n Partial<Pick<ToolCredential, \"expires_at\">>,\n ) => request<ToolCredential>(\"POST\", idAccount, \"tool-credentials\", body),\n\n updateToolCredential: (\n idAccount: number,\n id: number,\n body: Partial<\n Pick<ToolCredential, \"id_tool\" | \"label\" | \"credentials_encrypted\" | \"expires_at\" | \"status\">\n >,\n ) => request<ToolCredential>(\"PUT\", idAccount, `tool-credentials/${id}`, body),\n\n deleteToolCredential: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `tool-credentials/${id}`),\n\n // --- Contact Users ---\n listContactUsers: (idAccount: number, params?: Record<string, string>) =>\n request<ContactUser[]>(\"GET\", idAccount, \"contact-users\", undefined, params),\n\n getContactUser: (idAccount: number, id: number) =>\n request<ContactUser>(\"GET\", idAccount, `contact-users/${id}`),\n\n // --- Contacts ---\n listGagentsContacts: (idAccount: number, params?: Record<string, string>) =>\n request<GagentsContact[]>(\"GET\", idAccount, \"contacts\", undefined, params),\n\n // --- Calendar Integration ---\n initiateCalendarConnect: (\n idAccount: number,\n body: { external_reference: string; provider?: string },\n ) => request<{ auth_url: string }>(\"POST\", idAccount, \"calendar/connect\", body),\n\n getCalendarStatus: (\n idAccount: number,\n externalReference: string,\n provider = \"google-calendar\",\n ) =>\n request<CalendarStatus>(\n \"GET\",\n idAccount,\n `calendar/status/${encodeURIComponent(externalReference)}`,\n undefined,\n { provider },\n ),\n\n checkCalendarAvailability: (\n idAccount: number,\n body: { id_professional: number; start_time: string; end_time: string },\n ) => request<AvailabilityResult>(\"POST\", idAccount, \"calendar/availability\", body),\n\n disconnectCalendar: (\n idAccount: number,\n externalReference: string,\n provider = \"google-calendar\",\n ) =>\n request<void>(\n \"DELETE\",\n idAccount,\n `calendar/disconnect/${encodeURIComponent(externalReference)}`,\n undefined,\n { provider },\n ),\n\n // --- Capabilities ---\n getCapabilities: (idAccount: number) =>\n request<CapabilitiesResponse>(\"GET\", idAccount, \"capabilities\"),\n\n getAgentCapabilities: (idAccount: number, idAgent: number) =>\n request<AgentCapability[]>(\"GET\", idAccount, `agents/${idAgent}/capabilities`),\n\n updateAgentCapabilities: (\n idAccount: number,\n idAgent: number,\n body: AgentCapabilitiesPayload,\n ) => request<AgentCapability[]>(\"PUT\", idAccount, `agents/${idAgent}/capabilities`, body),\n };\n}\n\nexport type GagentsClient = ReturnType<typeof createGagentsClient>;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useMemo } from \"react\";\nimport { createGagentsClient } from \"../client\";\n\n// ---------------------------------------------------------------------------\n// Hook Configuration\n// ---------------------------------------------------------------------------\n\nexport interface GagentsHookConfig {\n accountId: number;\n token: string;\n baseUrl: string;\n language?: string;\n idWl?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper — memoized client from config\n// ---------------------------------------------------------------------------\n\nexport function useGagentsClient(config: GagentsHookConfig) {\n return useMemo(\n () =>\n createGagentsClient({\n baseUrl: config.baseUrl,\n token: config.token,\n language: config.language,\n idWl: config.idWl,\n }),\n [config.baseUrl, config.token, config.language, config.idWl],\n );\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useAgents(config: GagentsHookConfig, params?: Record<string, string>) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"agents\", config.accountId, params],\n queryFn: () => client.listAgents(config.accountId, params),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useAgent(config: GagentsHookConfig, id: number | null) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"agent\", config.accountId, id],\n queryFn: () => client.getAgent(config.accountId, id!),\n enabled: !!config.token && !!config.accountId && !!id,\n select: (res) => {\n const d = res.data;\n return Array.isArray(d) ? d[0] : d;\n },\n });\n}\n\nexport function useCreateAgent(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: {\n title: string;\n photo?: string;\n delay_typing?: number;\n waiting_time?: number;\n }) => client.createAgent(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agents\"] });\n },\n });\n}\n\nexport function useUpdateAgent(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: {\n title?: string;\n identity?: string | null;\n mission?: string | null;\n tone_style_format?: string | null;\n rules?: string | null;\n conversation_flow?: string | null;\n context?: string | null;\n change_notes?: string;\n photo?: string;\n delay_typing?: number;\n waiting_time?: number;\n active?: boolean;\n };\n }) => client.updateAgent(config.accountId, id, body),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agents\"] });\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"agent\", config.accountId, variables.id],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"prompt-versions\", config.accountId, variables.id],\n });\n },\n });\n}\n\nexport function useDeleteAgent(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteAgent(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agents\"] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useTools(config: GagentsHookConfig, params?: Record<string, string>) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"tools\", config.accountId, params],\n queryFn: () => client.listTools(config.accountId, params),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useTool(config: GagentsHookConfig, id: number | null) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"tool\", config.accountId, id],\n queryFn: () => client.getTool(config.accountId, id!),\n enabled: !!config.token && !!config.accountId && !!id,\n select: (res) => {\n const d = res.data;\n return Array.isArray(d) ? d[0] : d;\n },\n });\n}\n\nexport function useCreateTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: {\n name: string;\n slug: string;\n type: string;\n description?: string;\n function_definitions?: string;\n }) => client.createTool(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tools\"] });\n },\n });\n}\n\nexport function useUpdateTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: {\n name?: string;\n type?: string;\n description?: string;\n function_definitions?: string;\n };\n }) => client.updateTool(config.accountId, id, body),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tools\"] });\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"tool\", config.accountId, variables.id],\n });\n },\n });\n}\n\nexport function useDeleteTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteTool(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tools\"] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useObjectives(config: GagentsHookConfig, idAgent: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"objectives\", config.accountId, idAgent],\n queryFn: () => client.listObjectives(config.accountId, idAgent),\n enabled: !!config.token && !!config.accountId && !!idAgent,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useCreateObjective(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n idAgent,\n body,\n }: {\n idAgent: number;\n body: {\n title: string;\n slug?: string;\n instruction?: string | null;\n description?: string | null;\n conversation_flow?: string | null;\n rules?: string | null;\n order?: number;\n active?: boolean;\n };\n }) => client.createObjective(config.accountId, idAgent, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"objectives\"] });\n },\n });\n}\n\nexport function useUpdateObjective(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n idAgent,\n id,\n body,\n }: {\n idAgent: number;\n id: number;\n body: Partial<{\n title: string;\n slug: string;\n instruction: string | null;\n description: string | null;\n conversation_flow: string | null;\n rules: string | null;\n order: number;\n active: boolean;\n }>;\n }) => client.updateObjective(config.accountId, idAgent, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"objectives\"] });\n },\n });\n}\n\nexport function useDeleteObjective(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ idAgent, id }: { idAgent: number; id: number }) =>\n client.deleteObjective(config.accountId, idAgent, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"objectives\"] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useAgentTools(config: GagentsHookConfig, idAgent: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"agent-tools\", config.accountId, idAgent],\n queryFn: () => client.listAgentTools(config.accountId, idAgent),\n enabled: !!config.token && !!config.accountId && !!idAgent,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useAddAgentTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n idAgent,\n body,\n }: {\n idAgent: number;\n body: { id_tool: number; enabled?: boolean; custom_instructions?: string };\n }) => client.addAgentTool(config.accountId, idAgent, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agent-tools\"] });\n },\n });\n}\n\nexport function useRemoveAgentTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ idAgent, id }: { idAgent: number; id: number }) =>\n client.removeAgentTool(config.accountId, idAgent, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agent-tools\"] });\n },\n });\n}\n\nexport function useUpdateAgentTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n idAgent,\n id,\n body,\n }: {\n idAgent: number;\n id: number;\n body: Partial<{\n enabled: boolean;\n custom_instructions: string | null;\n parameter_mappings: string | null;\n id_tool_credential: number | null;\n }>;\n }) => client.updateAgentTool(config.accountId, idAgent, id, body),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"agent-tools\", config.accountId, variables.idAgent],\n });\n },\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useConversations(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"conversations\", config.accountId],\n queryFn: () => client.listConversations(config.accountId),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useAgentConversations(config: GagentsHookConfig, idAgent: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"conversations\", config.accountId, \"agent\", idAgent],\n queryFn: () => client.listAgentConversations(config.accountId, idAgent),\n enabled: !!config.token && !!config.accountId && !!idAgent,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useConversation(config: GagentsHookConfig, id: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"conversations\", config.accountId, id],\n queryFn: () => client.getConversation(config.accountId, id),\n enabled: !!config.token && !!config.accountId && !!id,\n select: (res) => {\n const d = res.data;\n return Array.isArray(d) ? d[0] : d;\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { ToolCredential } from \"../types\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\n// --- Prompt Versions (read-only) ---\n\nexport function usePromptVersions(config: GagentsHookConfig, idAgent: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"prompt-versions\", config.accountId, idAgent],\n queryFn: () => client.listPromptVersions(config.accountId, idAgent),\n enabled: !!config.token && !!config.accountId && !!idAgent,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\n// --- Tool Credentials (CRUD) ---\n\nexport function useToolCredentials(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"tool-credentials\", config.accountId],\n queryFn: () => client.listToolCredentials(config.accountId),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useCreateToolCredential(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (\n body: Pick<ToolCredential, \"id_tool\" | \"label\" | \"credentials_encrypted\"> &\n Partial<Pick<ToolCredential, \"expires_at\">>,\n ) => client.createToolCredential(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tool-credentials\"] });\n },\n });\n}\n\nexport function useUpdateToolCredential(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: Partial<\n Pick<ToolCredential, \"id_tool\" | \"label\" | \"credentials_encrypted\" | \"expires_at\" | \"status\">\n >;\n }) => client.updateToolCredential(config.accountId, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tool-credentials\"] });\n },\n });\n}\n\nexport function useDeleteToolCredential(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteToolCredential(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tool-credentials\"] });\n },\n });\n}\n\n// --- Contact Users (read-only) ---\n\nexport function useContactUsers(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"contact-users\", config.accountId],\n queryFn: () => client.listContactUsers(config.accountId),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useGagentsContacts(config: GagentsHookConfig, params?: Record<string, string>) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"contacts\", config.accountId, params],\n queryFn: () => client.listGagentsContacts(config.accountId, params),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\nimport type { CapabilitiesResponse, AgentCapability, AgentCapabilitiesPayload } from \"../types/capabilities\";\n\nexport function useCapabilities(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"capabilities\", config.accountId],\n queryFn: async (): Promise<CapabilitiesResponse> => {\n const res = await client.getCapabilities(config.accountId);\n return (res.data as unknown as CapabilitiesResponse) ?? { product: null, categories: [] };\n },\n enabled: !!config.token && !!config.accountId,\n });\n}\n\nexport function useAgentCapabilities(config: GagentsHookConfig, agentId: number | null) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"agent-capabilities\", config.accountId, agentId],\n queryFn: async (): Promise<AgentCapability[]> => {\n const res = await client.getAgentCapabilities(config.accountId, agentId!);\n const d = res.data;\n return (Array.isArray(d) ? d : []) as AgentCapability[];\n },\n enabled: !!config.token && !!config.accountId && !!agentId,\n });\n}\n\nexport function useUpdateAgentCapabilities(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ agentId, payload }: { agentId: number; payload: AgentCapabilitiesPayload }) =>\n client.updateAgentCapabilities(config.accountId, agentId, payload),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"agent-capabilities\", config.accountId, variables.agentId],\n });\n // Also invalidate agent-tools since capabilities map to tools\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"agent-tools\"],\n });\n },\n });\n}\n","import { useMemo } from \"react\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useToolCredentials } from \"./use-settings\";\nimport { useAgentTools } from \"./use-agent-tools\";\nimport { useTools } from \"./use-tools\";\nimport {\n INTEGRATIONS_REGISTRY,\n type IntegrationDefinition,\n} from \"../data/integrations-registry\";\nimport type { AgentTool, Tool, ToolCredential } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type IntegrationCardState =\n | \"available\"\n | \"connected\"\n | \"expired\"\n | \"coming_soon\";\n\nexport interface IntegrationCardData {\n /** Static definition from registry */\n definition: IntegrationDefinition;\n /** Resolved visual state */\n state: IntegrationCardState;\n /** Matching credential if one exists */\n credential: ToolCredential | null;\n /** Matching tool record if one exists */\n tool: Tool | null;\n /** How many agents share this credential */\n sharedByAgentsCount: number;\n /** Whether this agent has a linked agent_tool for this integration */\n linkedToAgent: boolean;\n /** Credential ID — set for connected/expired cards, undefined for \"add new\" */\n credentialId?: number;\n /** Account label (email or label from credential) */\n accountLabel?: string;\n /** Whether this is the \"add new account\" card */\n isAddNew?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Cross-references the static integrations registry with live data\n * (tools, tool_credentials, agent_tools) to produce card state for each\n * integration entry.\n *\n * Returns:\n * - One card per existing credential (connected/expired)\n * - One \"add new\" card per integration type\n * - Coming soon cards as before\n */\nexport function useIntegrationState(\n config: GagentsHookConfig,\n agentId: number | null,\n) {\n const { data: credentialsData, isLoading: loadingCredentials } =\n useToolCredentials(config);\n const { data: toolsData, isLoading: loadingTools } = useTools(config);\n const { data: agentToolsData, isLoading: loadingAgentTools } = useAgentTools(\n config,\n agentId ?? 0,\n );\n\n const isLoading = loadingCredentials || loadingTools || loadingAgentTools;\n\n const cards: IntegrationCardData[] = useMemo(() => {\n const credentials: ToolCredential[] = credentialsData?.data ?? [];\n const tools: Tool[] = toolsData?.data ?? [];\n const agentTools: AgentTool[] = agentToolsData?.data ?? [];\n\n const result: IntegrationCardData[] = [];\n\n for (const def of INTEGRATIONS_REGISTRY) {\n // coming_soon short-circuit\n if (def.status === \"coming_soon\") {\n result.push({\n definition: def,\n state: \"coming_soon\" as const,\n credential: null,\n tool: null,\n sharedByAgentsCount: 0,\n linkedToAgent: false,\n });\n continue;\n }\n\n // Find tool record matching registry slug\n const matchedTool = tools.find((t) => t.slug === def.slug) ?? null;\n\n // Find ALL credentials for this integration\n // Credentials can be linked via id_tool OR id_platform_integration\n // We match by tool slug through the tool record\n const matchedCredentials = matchedTool\n ? credentials.filter((c) => c.id_tool === matchedTool.id)\n : [];\n\n // Also check credentials linked via platform_integration\n // These credentials have id_platform_integration set but no id_tool,\n // typically created by OAuth callbacks (e.g. Google Calendar)\n const piCredentials = credentials.filter(\n (c) =>\n c.id_platform_integration != null &&\n !c.id_tool,\n );\n\n // Combine: merge tool-based and PI-based credentials, dedup by id.\n // Previously PI credentials were only included when matchedTool was null,\n // which caused connected integrations to not appear after OAuth.\n const seenIds = new Set<number>();\n const allCredentials: ToolCredential[] = [];\n for (const cred of [...matchedCredentials, ...piCredentials]) {\n if (!seenIds.has(cred.id)) {\n seenIds.add(cred.id);\n allCredentials.push(cred);\n }\n }\n\n // Check if this agent has a linked agent_tool for this tool\n const linkedToAgent = matchedTool\n ? agentTools.some((at) => at.id_tool === matchedTool.id)\n : false;\n\n // Create one card per existing credential\n for (const cred of allCredentials) {\n const state: IntegrationCardState =\n cred.status === \"expired\" ? \"expired\" : \"connected\";\n\n // Derive account label from external_reference or label\n const accountLabel =\n cred.external_reference || cred.label || undefined;\n\n result.push({\n definition: def,\n state,\n credential: cred,\n tool: matchedTool,\n sharedByAgentsCount: 1,\n linkedToAgent,\n credentialId: cred.id,\n accountLabel,\n });\n }\n\n // Always add an \"add new account\" card for this integration type\n result.push({\n definition: def,\n state: \"available\" as const,\n credential: null,\n tool: matchedTool,\n sharedByAgentsCount: 0,\n linkedToAgent: false,\n isAddNew: true,\n });\n }\n\n return result;\n }, [credentialsData, toolsData, agentToolsData]);\n\n return { cards, isLoading };\n}\n","export type IntegrationAuthType = \"oauth2\" | \"api_key\" | \"none\";\nexport type IntegrationStatus = \"available\" | \"coming_soon\";\n\nexport interface IntegrationDefinition {\n slug: string;\n name: string;\n description: string;\n icon: string; // Lucide icon name\n authType: IntegrationAuthType;\n status: IntegrationStatus;\n}\n\nexport const INTEGRATIONS_REGISTRY: IntegrationDefinition[] = [\n {\n slug: \"google-calendar\",\n name: \"Google Agenda\",\n description: \"Sincronize agendamentos com o Google Calendar\",\n icon: \"CalendarSync\",\n authType: \"oauth2\",\n status: \"available\",\n },\n // Future integrations — add entries here without code changes\n];\n","import { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { useAgents, useDeleteAgent } from \"../../hooks\";\nimport type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { DataTable } from \"@greatapps/greatauth-ui\";\nimport {\n Input,\n Badge,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Pencil, Trash2, Search } from \"lucide-react\";\nimport { EntityAvatar } from \"@greatapps/greatauth-ui\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\nfunction useColumns(\n onEdit: (agent: Agent) => void,\n onDelete: (id: number) => void,\n): ColumnDef<Agent>[] {\n return [\n {\n accessorKey: \"title\",\n header: \"Nome\",\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2\">\n <EntityAvatar photo={row.original.photo} name={row.original.title} size=\"sm\" />\n <span className=\"font-medium\">{row.original.title}</span>\n </div>\n ),\n sortingFn: (rowA, rowB) =>\n rowA.original.title\n .toLowerCase()\n .localeCompare(rowB.original.title.toLowerCase()),\n },\n {\n accessorKey: \"active\",\n header: \"Status\",\n cell: ({ row }) =>\n row.original.active ? (\n <Badge variant=\"default\">Ativo</Badge>\n ) : (\n <Badge variant=\"secondary\">Inativo</Badge>\n ),\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {format(new Date(row.original.datetime_add), \"dd/MM/yyyy\", {\n locale: ptBR,\n })}\n </span>\n ),\n },\n {\n id: \"actions\",\n size: 80,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label=\"Editar\"\n onClick={() => onEdit(row.original)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Editar</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n aria-label=\"Excluir\"\n onClick={() => onDelete(row.original.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Excluir</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport function AgentsTable({ config, onNavigateToAgent }: { config: GagentsHookConfig; onNavigateToAgent?: (agentId: number) => void }) {\n const [search, setSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n\n const queryParams = useMemo(() => {\n const params: Record<string, string> = {\n limit: \"15\",\n page: String(page),\n };\n if (search) {\n params.search = search;\n }\n return params;\n }, [search, page]);\n\n const { data, isLoading } = useAgents(config, queryParams);\n const deleteAgent = useDeleteAgent(config);\n const [deleteId, setDeleteId] = useState<number | null>(null);\n\n const agents = data?.data || [];\n const total = data?.total || 0;\n\n const columns = useColumns(\n (agent) => onNavigateToAgent?.(agent.id),\n (id) => setDeleteId(id),\n );\n\n function handleDelete() {\n if (!deleteId) return;\n deleteAgent.mutate(deleteId, {\n onSuccess: () => {\n toast.success(\"Agente excluído\");\n setDeleteId(null);\n },\n onError: () => toast.error(\"Erro ao excluir agente\"),\n });\n }\n\n function handleSearchChange(value: string) {\n setSearch(value);\n setPage(1);\n }\n\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search aria-hidden=\"true\" className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar agentes\\u2026\"\n aria-label=\"Buscar agentes\"\n name=\"search\"\n autoComplete=\"off\"\n value={search}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={agents}\n isLoading={isLoading}\n emptyMessage=\"Nenhum agente encontrado\"\n total={total}\n page={page}\n onPageChange={setPage}\n pageSize={15}\n />\n\n {/* Delete confirmation */}\n <AlertDialog\n open={!!deleteId}\n onOpenChange={(open) => !open && setDeleteId(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir agente?</AlertDialogTitle>\n <AlertDialogDescription>\n Esta ação não pode ser desfeita. O agente será removido\n permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel variant=\"outline\" size=\"default\">\n Cancelar\n </AlertDialogCancel>\n <AlertDialogAction\n variant=\"default\"\n size=\"default\"\n onClick={handleDelete}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useCreateAgent, useUpdateAgent } from \"../../hooks\";\nimport type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetFooter,\n Button,\n Input,\n Label,\n Switch,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { ImageCropUpload } from \"@greatapps/greatauth-ui\";\n\ninterface AgentFormDialogProps {\n config: GagentsHookConfig;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n agent?: Agent;\n idAccount?: string | number | null;\n}\n\ninterface FormState {\n title: string;\n photo: string;\n active: boolean;\n delayTyping: string;\n waitingTime: string;\n titleError: boolean;\n}\n\nfunction msToSeconds(ms: number | null | undefined): string {\n if (ms == null || ms === 0) return \"\";\n return String(Math.round(ms / 1000));\n}\n\nfunction secondsToMs(seconds: string): number | undefined {\n const val = parseFloat(seconds);\n if (isNaN(val) || val <= 0) return undefined;\n return Math.round(val * 1000);\n}\n\nfunction agentToFormState(agent: Agent): FormState {\n return {\n title: agent.title,\n photo: agent.photo || \"\",\n active: agent.active,\n delayTyping: msToSeconds(agent.delay_typing),\n waitingTime: msToSeconds(agent.waiting_time),\n titleError: false,\n };\n}\n\nconst emptyFormState: FormState = {\n title: \"\",\n photo: \"\",\n active: true,\n delayTyping: \"\",\n waitingTime: \"\",\n titleError: false,\n};\n\nexport function AgentFormDialog({\n config,\n open,\n onOpenChange,\n agent,\n idAccount,\n}: AgentFormDialogProps) {\n const isEditing = !!agent;\n const createAgent = useCreateAgent(config);\n const updateAgent = useUpdateAgent(config);\n\n const [form, setForm] = useState<FormState>(emptyFormState);\n\n /* eslint-disable react-hooks/set-state-in-effect -- form state sync from props */\n useEffect(() => {\n if (agent) {\n setForm(agentToFormState(agent));\n } else {\n setForm(emptyFormState);\n }\n }, [agent, open]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n function updateField<K extends keyof FormState>(key: K, value: FormState[K]) {\n setForm((prev) => ({ ...prev, [key]: value }));\n }\n\n const isPending = createAgent.isPending || updateAgent.isPending;\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n\n if (!form.title.trim()) {\n updateField(\"titleError\", true);\n return;\n }\n\n const body: Record<string, unknown> = {\n title: form.title.trim(),\n active: form.active,\n };\n if (form.photo.trim()) body.photo = form.photo.trim();\n else if (isEditing) body.photo = \"\";\n\n const delayMs = secondsToMs(form.delayTyping);\n if (delayMs !== undefined) body.delay_typing = delayMs;\n else if (isEditing) body.delay_typing = 0;\n\n const waitingMs = secondsToMs(form.waitingTime);\n if (waitingMs !== undefined) body.waiting_time = waitingMs;\n else if (isEditing) body.waiting_time = 0;\n\n try {\n if (isEditing) {\n await updateAgent.mutateAsync({ id: agent.id, body });\n toast.success(\"Agente atualizado\");\n } else {\n await createAgent.mutateAsync(\n body as { title: string; prompt?: string; photo?: string; delay_typing?: number; waiting_time?: number },\n );\n toast.success(\"Agente criado\");\n }\n onOpenChange(false);\n } catch {\n toast.error(isEditing ? \"Erro ao atualizar agente\" : \"Erro ao criar agente\");\n }\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"sm:max-w-md\">\n <SheetHeader>\n <SheetTitle>\n {isEditing ? \"Editar Agente\" : \"Novo Agente\"}\n </SheetTitle>\n </SheetHeader>\n <form onSubmit={handleSubmit} className=\"flex flex-1 flex-col overflow-hidden\">\n <div className=\"flex-1 overflow-y-auto px-4 space-y-4\">\n <div className=\"flex justify-center\">\n <ImageCropUpload\n value={form.photo || null}\n onChange={(url) => updateField(\"photo\", url)}\n onRemove={() => updateField(\"photo\", \"\")}\n entityType=\"agents\"\n entityId={agent?.id}\n idAccount={typeof idAccount === \"string\" ? Number(idAccount) : (idAccount ?? Number(config.accountId) ?? 0)}\n name={form.title || null}\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"agent-title\">Nome do Agente *</Label>\n <Input\n id=\"agent-title\"\n name=\"title\"\n value={form.title}\n onChange={(e) => {\n setForm((prev) => ({\n ...prev,\n title: e.target.value,\n titleError: e.target.value.trim() ? false : prev.titleError,\n }));\n }}\n placeholder=\"Ex: Assistente de Agendamento\"\n required\n disabled={isPending}\n />\n {form.titleError && (\n <p className=\"text-sm text-destructive\">Nome é obrigatório</p>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Switch\n id=\"agent-active\"\n checked={form.active}\n onCheckedChange={(checked) => updateField(\"active\", checked)}\n disabled={isPending}\n />\n <Label htmlFor=\"agent-active\" className=\"cursor-pointer\">\n {form.active ? \"Ativo\" : \"Inativo\"}\n </Label>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"agent-delay\">Delay de Digitação (s)</Label>\n <Input\n id=\"agent-delay\"\n name=\"delay\"\n type=\"number\"\n value={form.delayTyping}\n onChange={(e) => updateField(\"delayTyping\", e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"0.5\"\n disabled={isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Tempo de simulação de digitação\n </p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"agent-waiting\">Tempo de Espera (s)</Label>\n <Input\n id=\"agent-waiting\"\n name=\"waiting\"\n type=\"number\"\n value={form.waitingTime}\n onChange={(e) => updateField(\"waitingTime\", e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"0.5\"\n disabled={isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Espera por mensagens agrupadas\n </p>\n </div>\n </div>\n </div>\n <SheetFooter className=\"flex-row justify-end border-t\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={isPending || !form.title.trim()}>\n {isPending ? (\n <Loader2 aria-hidden=\"true\" className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : null}\n {isEditing ? \"Salvar\" : \"Criar\"}\n </Button>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useUpdateAgent } from \"../../hooks\";\nimport type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n Button,\n Input,\n Label,\n Switch,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetFooter,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { ImageCropUpload } from \"@greatapps/greatauth-ui\";\n\ninterface AgentEditFormProps {\n config: GagentsHookConfig;\n agent: Agent;\n idAccount: string | number | null;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\ninterface FormState {\n title: string;\n photo: string;\n active: boolean;\n delayTyping: string;\n waitingTime: string;\n titleError: boolean;\n}\n\nfunction msToSeconds(ms: number | null): string {\n if (ms == null || ms === 0) return \"\";\n return String(Math.round(ms / 1000));\n}\n\nfunction secondsToMs(seconds: string): number | undefined {\n const val = parseFloat(seconds);\n if (isNaN(val) || val <= 0) return undefined;\n return Math.round(val * 1000);\n}\n\nfunction agentToFormState(agent: Agent): FormState {\n return {\n title: agent.title,\n photo: agent.photo || \"\",\n active: agent.active,\n delayTyping: msToSeconds(agent.delay_typing),\n waitingTime: msToSeconds(agent.waiting_time),\n titleError: false,\n };\n}\n\nexport function AgentEditForm({ config, agent, idAccount, open, onOpenChange }: AgentEditFormProps) {\n const updateAgent = useUpdateAgent(config);\n const [form, setForm] = useState<FormState>(() => agentToFormState(agent));\n\n useEffect(() => {\n setForm(agentToFormState(agent));\n }, [agent]);\n\n function updateField<K extends keyof FormState>(key: K, value: FormState[K]) {\n setForm((prev) => ({ ...prev, [key]: value }));\n }\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n\n if (!form.title.trim()) {\n updateField(\"titleError\", true);\n return;\n }\n\n const body: Record<string, unknown> = {\n title: form.title.trim(),\n active: form.active,\n };\n if (form.photo.trim()) body.photo = form.photo.trim();\n else body.photo = \"\";\n\n const delayMs = secondsToMs(form.delayTyping);\n if (delayMs !== undefined) body.delay_typing = delayMs;\n else body.delay_typing = 0;\n\n const waitingMs = secondsToMs(form.waitingTime);\n if (waitingMs !== undefined) body.waiting_time = waitingMs;\n else body.waiting_time = 0;\n\n try {\n await updateAgent.mutateAsync({ id: agent.id, body });\n toast.success(\"Agente atualizado\");\n onOpenChange?.(false);\n } catch {\n toast.error(\"Erro ao atualizar agente\");\n }\n }\n\n const formContent = (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"flex justify-center\">\n <ImageCropUpload\n value={form.photo || null}\n onChange={(url) => updateField(\"photo\", url)}\n onRemove={() => updateField(\"photo\", \"\")}\n entityType=\"agents\"\n entityId={agent.id}\n idAccount={typeof idAccount === \"string\" ? Number(idAccount) : (idAccount ?? 0)}\n name={form.title || null}\n disabled={updateAgent.isPending}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-title\">Nome do Agente *</Label>\n <Input\n id=\"edit-title\"\n name=\"title\"\n value={form.title}\n onChange={(e) => {\n setForm((prev) => ({\n ...prev,\n title: e.target.value,\n titleError: e.target.value.trim() ? false : prev.titleError,\n }));\n }}\n placeholder=\"Ex: Assistente de Agendamento\"\n disabled={updateAgent.isPending}\n />\n {form.titleError && (\n <p className=\"text-sm text-destructive\">Nome é obrigatório</p>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Switch\n id=\"edit-active\"\n checked={form.active}\n onCheckedChange={(checked) => updateField(\"active\", checked)}\n disabled={updateAgent.isPending}\n />\n <Label htmlFor=\"edit-active\" className=\"cursor-pointer\">\n {form.active ? \"Ativo\" : \"Inativo\"}\n </Label>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-delay\">Delay de Digitação (s)</Label>\n <Input\n id=\"edit-delay\"\n name=\"delay\"\n type=\"number\"\n value={form.delayTyping}\n onChange={(e) => updateField(\"delayTyping\", e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"0.5\"\n disabled={updateAgent.isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Tempo de simulação de digitação\n </p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-waiting\">Tempo de Espera (s)</Label>\n <Input\n id=\"edit-waiting\"\n name=\"waiting\"\n type=\"number\"\n value={form.waitingTime}\n onChange={(e) => updateField(\"waitingTime\", e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"0.5\"\n disabled={updateAgent.isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Espera por mensagens agrupadas\n </p>\n </div>\n </div>\n\n <SheetFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange?.(false)}\n disabled={updateAgent.isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={updateAgent.isPending}>\n {updateAgent.isPending && (\n <Loader2 aria-hidden=\"true\" className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Salvar\n </Button>\n </SheetFooter>\n </form>\n );\n\n if (open !== undefined && onOpenChange) {\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"sm:max-w-md overflow-y-auto\">\n <SheetHeader>\n <SheetTitle>Editar Agente</SheetTitle>\n </SheetHeader>\n {formContent}\n </SheetContent>\n </Sheet>\n );\n }\n\n return <div className=\"max-w-lg pt-4\">{formContent}</div>;\n}\n","import { useState } from \"react\";\nimport type { Agent, Objective, ConversationFlowStep } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n useObjectives,\n useCreateObjective,\n useUpdateObjective,\n useDeleteObjective,\n} from \"../../hooks\";\nimport {\n Input,\n Button,\n Switch,\n Skeleton,\n Textarea,\n Label,\n Badge,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetFooter,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n Sortable,\n SortableContent,\n SortableItem,\n SortableItemHandle,\n SortableOverlay,\n} from \"../ui/sortable\";\nimport { ConversationFlowEditor } from \"./conversation-flow-editor\";\nimport { Trash2, Target, Pencil, Plus, GripVertical } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ninterface AgentObjectivesListProps {\n agent: Agent;\n config: GagentsHookConfig;\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\ninterface ObjectiveFormState {\n title: string;\n slug: string;\n instruction: string;\n description: string;\n conversation_flow: ConversationFlowStep[];\n rules: string;\n}\n\nconst EMPTY_FORM: ObjectiveFormState = { title: \"\", slug: \"\", instruction: \"\", description: \"\", conversation_flow: [], rules: \"\" };\n\nexport function AgentObjectivesList({ agent, config }: AgentObjectivesListProps) {\n const { data: objectivesData, isLoading } = useObjectives(config, agent.id);\n const createMutation = useCreateObjective(config);\n const updateMutation = useUpdateObjective(config);\n const deleteMutation = useDeleteObjective(config);\n\n const [formOpen, setFormOpen] = useState(false);\n const [editTarget, setEditTarget] = useState<Objective | null>(null);\n const [form, setForm] = useState<ObjectiveFormState>(EMPTY_FORM);\n const [slugManual, setSlugManual] = useState(false);\n const [removeTarget, setRemoveTarget] = useState<Objective | null>(null);\n\n const objectives = objectivesData?.data || [];\n const sortedObjectives = [...objectives].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n async function handleReorder(newItems: Objective[]) {\n const updates = newItems\n .map((item, index) => ({ ...item, order: index + 1 }))\n .filter((item, index) => sortedObjectives[index]?.id !== item.id);\n\n try {\n for (const item of updates) {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: item.id,\n body: { order: item.order },\n });\n }\n toast.success(\"Ordem atualizada\");\n } catch {\n toast.error(\"Erro ao reordenar objetivos\");\n }\n }\n\n function openCreate() {\n setEditTarget(null);\n setForm(EMPTY_FORM);\n setSlugManual(false);\n setFormOpen(true);\n }\n\n function openEdit(objective: Objective) {\n setEditTarget(objective);\n let parsedFlow: ConversationFlowStep[] = [];\n if (objective.conversation_flow) {\n try { parsedFlow = JSON.parse(objective.conversation_flow); } catch { /* invalid JSON */ }\n }\n setForm({\n title: objective.title,\n slug: objective.slug || \"\",\n instruction: objective.instruction || \"\",\n description: objective.description || \"\",\n conversation_flow: parsedFlow,\n rules: objective.rules || \"\",\n });\n setSlugManual(true);\n setFormOpen(true);\n }\n\n async function handleSubmit() {\n if (!form.title.trim()) return;\n\n const effectiveSlug = form.slug.trim() || slugify(form.title);\n const nextOrder =\n sortedObjectives.length > 0\n ? Math.max(...sortedObjectives.map((o) => o.order)) + 1\n : 1;\n\n try {\n const bodyFields = {\n title: form.title.trim(),\n slug: effectiveSlug,\n instruction: form.instruction.trim() || null,\n description: form.description.trim() || null,\n conversation_flow: form.conversation_flow.length > 0 ? JSON.stringify(form.conversation_flow) : null,\n rules: form.rules.trim() || null,\n };\n\n if (editTarget) {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: editTarget.id,\n body: bodyFields,\n });\n toast.success(\"Objetivo atualizado\");\n } else {\n await createMutation.mutateAsync({\n idAgent: agent.id,\n body: { ...bodyFields, order: nextOrder },\n });\n toast.success(\"Objetivo criado\");\n }\n setFormOpen(false);\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : editTarget\n ? \"Erro ao atualizar objetivo\"\n : \"Erro ao criar objetivo\",\n );\n }\n }\n\n async function handleToggleActive(objective: Objective, checked: boolean) {\n try {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: objective.id,\n body: { active: checked },\n });\n toast.success(checked ? \"Objetivo ativado\" : \"Objetivo desativado\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao alterar estado do objetivo\",\n );\n }\n }\n\n async function handleRemove() {\n if (!removeTarget) return;\n try {\n await deleteMutation.mutateAsync({\n idAgent: agent.id,\n id: removeTarget.id,\n });\n toast.success(\"Objetivo removido\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao remover o objetivo\",\n );\n } finally {\n setRemoveTarget(null);\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3 p-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-14 w-full\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n {sortedObjectives.length} objetivo{sortedObjectives.length !== 1 ? \"s\" : \"\"} definido{sortedObjectives.length !== 1 ? \"s\" : \"\"}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n Objetivos são modos de conversa que o agente ativa automaticamente conforme a intenção do utilizador.\n </p>\n </div>\n <Button onClick={openCreate} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Objetivo\n </Button>\n </div>\n\n {sortedObjectives.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <Target className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Nenhum objetivo definido. Adicione objetivos para orientar o agente em diferentes contextos.\n </p>\n </div>\n ) : (\n <Sortable\n value={sortedObjectives}\n onValueChange={handleReorder}\n getItemValue={(item) => item.id}\n >\n <SortableContent className=\"space-y-2\">\n {sortedObjectives.map((objective) => (\n <SortableItem\n key={objective.id}\n value={objective.id}\n className=\"flex items-center gap-3 rounded-lg border bg-card p-3\"\n >\n <SortableItemHandle className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <GripVertical aria-hidden=\"true\" className=\"h-5 w-5\" />\n </SortableItemHandle>\n\n <div className=\"flex flex-1 flex-col gap-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate font-medium\">\n {objective.title}\n </span>\n {objective.slug && (\n <Badge variant=\"secondary\" className=\"shrink-0 text-xs font-mono\">\n {objective.slug}\n </Badge>\n )}\n </div>\n {(objective.instruction || objective.description) && (\n <div className=\"space-y-0.5\">\n {objective.instruction && (\n <p className=\"text-xs font-medium text-muted-foreground\">\n Quando: {objective.instruction}\n </p>\n )}\n {objective.description && (\n <p className=\"line-clamp-1 text-xs text-muted-foreground\">\n {objective.description}\n </p>\n )}\n </div>\n )}\n </div>\n\n <Switch\n aria-label=\"Ativar/Desativar\"\n checked={objective.active}\n onCheckedChange={(checked) =>\n handleToggleActive(objective, checked)\n }\n disabled={updateMutation.isPending}\n />\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Editar\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => openEdit(objective)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Excluir\"\n className=\"shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={() => setRemoveTarget(objective)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </SortableItem>\n ))}\n </SortableContent>\n <SortableOverlay>\n {({ value }) => {\n const obj = sortedObjectives.find((o) => o.id === value);\n return (\n <div className=\"flex items-center gap-3 rounded-lg border bg-card p-3 shadow-lg\">\n <GripVertical aria-hidden=\"true\" className=\"h-5 w-5 text-muted-foreground\" />\n <span className=\"font-medium\">{obj?.title}</span>\n </div>\n );\n }}\n </SortableOverlay>\n </Sortable>\n )}\n\n {/* Create/Edit Sheet */}\n <Sheet open={formOpen} onOpenChange={setFormOpen}>\n <SheetContent className=\"sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>\n {editTarget ? \"Editar Objetivo\" : \"Novo Objetivo\"}\n </SheetTitle>\n </SheetHeader>\n <div className=\"flex-1 overflow-y-auto px-4 space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-title\">Título *</Label>\n <Input\n id=\"objective-title\"\n name=\"title\"\n value={form.title}\n onChange={(e) => {\n const title = e.target.value;\n setForm((f) => ({\n ...f,\n title,\n ...(!slugManual ? { slug: slugify(title) } : {}),\n }));\n }}\n placeholder=\"Ex: Agendar Consulta\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-slug\">Slug (identificador) *</Label>\n <Input\n id=\"objective-slug\"\n name=\"slug\"\n value={form.slug}\n onChange={(e) => {\n setSlugManual(true);\n setForm((f) => ({ ...f, slug: e.target.value }));\n }}\n placeholder=\"Ex: agendar-consulta\"\n className=\"font-mono\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Gerado automaticamente. Usado pelo agente para identificar o objetivo.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-instruction\">Quando ativar (instrução curta) *</Label>\n <Input\n id=\"objective-instruction\"\n name=\"instruction\"\n value={form.instruction}\n onChange={(e) =>\n setForm((f) => ({ ...f, instruction: e.target.value }))\n }\n placeholder=\"Ex: Quando o utilizador quer agendar uma consulta\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Instrução curta que diz ao agente QUANDO ativar este objetivo. Aparece na secção [OBJETIVOS] do prompt.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-description\">Descrição</Label>\n <Textarea\n id=\"objective-description\"\n name=\"description\"\n value={form.description}\n onChange={(e) =>\n setForm((f) => ({ ...f, description: e.target.value }))\n }\n placeholder=\"Descreva o propósito deste objectivo...\"\n rows={3}\n />\n <p className=\"text-xs text-muted-foreground\">\n Missão e propósito deste objectivo — o que o agente deve alcançar.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label>Fluxo de Conversa</Label>\n <ConversationFlowEditor\n steps={form.conversation_flow}\n onChange={(steps) => setForm((f) => ({ ...f, conversation_flow: steps }))}\n />\n <p className=\"text-xs text-muted-foreground\">\n Etapas que o agente segue quando este objectivo é activado.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-rules\">Regras</Label>\n <Textarea\n id=\"objective-rules\"\n name=\"rules\"\n value={form.rules}\n onChange={(e) =>\n setForm((f) => ({ ...f, rules: e.target.value }))\n }\n placeholder=\"Regras específicas deste objectivo...\"\n rows={3}\n />\n <p className=\"text-xs text-muted-foreground\">\n Restrições e limites específicos quando este objectivo está activo.\n </p>\n </div>\n </div>\n <SheetFooter className=\"flex-row justify-end border-t\">\n <Button\n variant=\"outline\"\n onClick={() => setFormOpen(false)}\n >\n Cancelar\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={\n !form.title.trim() ||\n createMutation.isPending ||\n updateMutation.isPending\n }\n >\n {editTarget ? \"Salvar\" : \"Criar\"}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n\n {/* Delete confirmation */}\n <AlertDialog\n open={!!removeTarget}\n onOpenChange={(open) => !open && setRemoveTarget(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remover objetivo?</AlertDialogTitle>\n <AlertDialogDescription>\n O objetivo será removido permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleRemove}\n disabled={deleteMutation.isPending}\n >\n Remover\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","import {\n type Announcements,\n closestCenter,\n closestCorners,\n DndContext,\n type DndContextProps,\n type DragEndEvent,\n type DraggableAttributes,\n type DraggableSyntheticListeners,\n DragOverlay,\n type DragStartEvent,\n type DropAnimation,\n defaultDropAnimationSideEffects,\n KeyboardSensor,\n MouseSensor,\n type ScreenReaderInstructions,\n TouchSensor,\n type UniqueIdentifier,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n restrictToHorizontalAxis,\n restrictToParentElement,\n restrictToVerticalAxis,\n} from \"@dnd-kit/modifiers\";\nimport {\n arrayMove,\n horizontalListSortingStrategy,\n SortableContext,\n type SortableContextProps,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { useComposedRefs } from \"../../lib/compose-refs\";\nimport { cn } from \"../../lib\";\n\nconst orientationConfig = {\n vertical: {\n modifiers: [restrictToVerticalAxis, restrictToParentElement],\n strategy: verticalListSortingStrategy,\n collisionDetection: closestCenter,\n },\n horizontal: {\n modifiers: [restrictToHorizontalAxis, restrictToParentElement],\n strategy: horizontalListSortingStrategy,\n collisionDetection: closestCenter,\n },\n mixed: {\n modifiers: [restrictToParentElement],\n strategy: undefined,\n collisionDetection: closestCorners,\n },\n};\n\nconst ROOT_NAME = \"Sortable\";\nconst CONTENT_NAME = \"SortableContent\";\nconst ITEM_NAME = \"SortableItem\";\nconst ITEM_HANDLE_NAME = \"SortableItemHandle\";\nconst OVERLAY_NAME = \"SortableOverlay\";\n\ninterface SortableRootContextValue<T> {\n id: string;\n items: UniqueIdentifier[];\n modifiers: DndContextProps[\"modifiers\"];\n strategy: SortableContextProps[\"strategy\"];\n activeId: UniqueIdentifier | null;\n setActiveId: (id: UniqueIdentifier | null) => void;\n getItemValue: (item: T) => UniqueIdentifier;\n flatCursor: boolean;\n}\n\nconst SortableRootContext =\n React.createContext<SortableRootContextValue<unknown> | null>(null);\n\nfunction useSortableContext(consumerName: string) {\n const context = React.useContext(SortableRootContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface GetItemValue<T> {\n /**\n * Callback that returns a unique identifier for each sortable item. Required for array of objects.\n * @example getItemValue={(item) => item.id}\n */\n getItemValue: (item: T) => UniqueIdentifier;\n}\n\ntype SortableProps<T> = DndContextProps &\n (T extends object ? GetItemValue<T> : Partial<GetItemValue<T>>) & {\n value: T[];\n onValueChange?: (items: T[]) => void;\n onMove?: (\n event: DragEndEvent & { activeIndex: number; overIndex: number },\n ) => void;\n strategy?: SortableContextProps[\"strategy\"];\n orientation?: \"vertical\" | \"horizontal\" | \"mixed\";\n flatCursor?: boolean;\n };\n\nfunction Sortable<T>(props: SortableProps<T>) {\n const {\n value,\n onValueChange,\n collisionDetection,\n modifiers,\n strategy,\n onMove,\n orientation = \"vertical\",\n flatCursor = false,\n getItemValue: getItemValueProp,\n accessibility,\n ...sortableProps\n } = props;\n\n const id = React.useId();\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null);\n\n const sensors = useSensors(\n useSensor(MouseSensor),\n useSensor(TouchSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n const config = React.useMemo(\n () => orientationConfig[orientation],\n [orientation],\n );\n\n const getItemValue = React.useCallback(\n (item: T): UniqueIdentifier => {\n if (typeof item === \"object\" && !getItemValueProp) {\n throw new Error(\n \"`getItemValue` is required when using array of objects\",\n );\n }\n return getItemValueProp\n ? getItemValueProp(item)\n : (item as UniqueIdentifier);\n },\n [getItemValueProp],\n );\n\n const items = React.useMemo(() => {\n return value.map((item) => getItemValue(item));\n }, [value, getItemValue]);\n\n /* eslint-disable react-hooks/preserve-manual-memoization, react-hooks/exhaustive-deps -- shadcn sortable: intentional dependency on specific props */\n const onDragStart = React.useCallback(\n (event: DragStartEvent) => {\n sortableProps.onDragStart?.(event);\n\n if (event.activatorEvent.defaultPrevented) return;\n\n setActiveId(event.active.id);\n },\n [sortableProps.onDragStart],\n );\n\n const onDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n sortableProps.onDragEnd?.(event);\n\n if (event.activatorEvent.defaultPrevented) return;\n\n const { active, over } = event;\n if (over && active.id !== over?.id) {\n const activeIndex = value.findIndex(\n (item) => getItemValue(item) === active.id,\n );\n const overIndex = value.findIndex(\n (item) => getItemValue(item) === over.id,\n );\n\n if (onMove) {\n onMove({ ...event, activeIndex, overIndex });\n } else {\n onValueChange?.(arrayMove(value, activeIndex, overIndex));\n }\n }\n setActiveId(null);\n },\n [value, onValueChange, onMove, getItemValue, sortableProps.onDragEnd],\n );\n\n const onDragCancel = React.useCallback(\n (event: DragEndEvent) => {\n sortableProps.onDragCancel?.(event);\n\n if (event.activatorEvent.defaultPrevented) return;\n\n setActiveId(null);\n },\n [sortableProps.onDragCancel],\n );\n /* eslint-enable react-hooks/preserve-manual-memoization, react-hooks/exhaustive-deps */\n\n const announcements: Announcements = React.useMemo(\n () => ({\n onDragStart({ active }) {\n const activeValue = active.id.toString();\n return `Grabbed sortable item \"${activeValue}\". Current position is ${active.data.current?.sortable.index + 1} of ${value.length}. Use arrow keys to move, space to drop.`;\n },\n onDragOver({ active, over }) {\n if (over) {\n const overIndex = over.data.current?.sortable.index ?? 0;\n const activeIndex = active.data.current?.sortable.index ?? 0;\n const moveDirection = overIndex > activeIndex ? \"down\" : \"up\";\n const activeValue = active.id.toString();\n return `Sortable item \"${activeValue}\" moved ${moveDirection} to position ${overIndex + 1} of ${value.length}.`;\n }\n return \"Sortable item is no longer over a droppable area. Press escape to cancel.\";\n },\n onDragEnd({ active, over }) {\n const activeValue = active.id.toString();\n if (over) {\n const overIndex = over.data.current?.sortable.index ?? 0;\n return `Sortable item \"${activeValue}\" dropped at position ${overIndex + 1} of ${value.length}.`;\n }\n return `Sortable item \"${activeValue}\" dropped. No changes were made.`;\n },\n onDragCancel({ active }) {\n const activeIndex = active.data.current?.sortable.index ?? 0;\n const activeValue = active.id.toString();\n return `Sorting cancelled. Sortable item \"${activeValue}\" returned to position ${activeIndex + 1} of ${value.length}.`;\n },\n onDragMove({ active, over }) {\n if (over) {\n const overIndex = over.data.current?.sortable.index ?? 0;\n const activeIndex = active.data.current?.sortable.index ?? 0;\n const moveDirection = overIndex > activeIndex ? \"down\" : \"up\";\n const activeValue = active.id.toString();\n return `Sortable item \"${activeValue}\" is moving ${moveDirection} to position ${overIndex + 1} of ${value.length}.`;\n }\n return \"Sortable item is no longer over a droppable area. Press escape to cancel.\";\n },\n }),\n [value],\n );\n\n const screenReaderInstructions: ScreenReaderInstructions = React.useMemo(\n () => ({\n draggable: `\n To pick up a sortable item, press space or enter.\n While dragging, use the ${orientation === \"vertical\" ? \"up and down\" : orientation === \"horizontal\" ? \"left and right\" : \"arrow\"} keys to move the item.\n Press space or enter again to drop the item in its new position, or press escape to cancel.\n `,\n }),\n [orientation],\n );\n\n const contextValue = React.useMemo(\n () => ({\n id,\n items,\n modifiers: modifiers ?? config.modifiers,\n strategy: strategy ?? config.strategy,\n activeId,\n setActiveId,\n getItemValue,\n flatCursor,\n }),\n [\n id,\n items,\n modifiers,\n strategy,\n config.modifiers,\n config.strategy,\n activeId,\n getItemValue,\n flatCursor,\n ],\n );\n\n return (\n <SortableRootContext.Provider\n value={contextValue as SortableRootContextValue<unknown>}\n >\n <DndContext\n collisionDetection={collisionDetection ?? config.collisionDetection}\n modifiers={modifiers ?? config.modifiers}\n sensors={sensors}\n {...sortableProps}\n id={id}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n accessibility={{\n announcements,\n screenReaderInstructions,\n ...accessibility,\n }}\n />\n </SortableRootContext.Provider>\n );\n}\n\nconst SortableContentContext = React.createContext<boolean>(false);\n\ninterface SortableContentProps extends React.ComponentProps<\"div\"> {\n strategy?: SortableContextProps[\"strategy\"];\n children: React.ReactNode;\n asChild?: boolean;\n withoutSlot?: boolean;\n}\n\nfunction SortableContent(props: SortableContentProps) {\n const {\n strategy: strategyProp,\n asChild,\n withoutSlot,\n children,\n ref,\n ...contentProps\n } = props;\n\n const context = useSortableContext(CONTENT_NAME);\n\n const ContentPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <SortableContentContext.Provider value={true}>\n <SortableContext\n items={context.items}\n strategy={strategyProp ?? context.strategy}\n >\n {withoutSlot ? (\n children\n ) : (\n <ContentPrimitive\n data-slot=\"sortable-content\"\n {...contentProps}\n ref={ref}\n >\n {children}\n </ContentPrimitive>\n )}\n </SortableContext>\n </SortableContentContext.Provider>\n );\n}\n\ninterface SortableItemContextValue {\n id: string;\n attributes: DraggableAttributes;\n listeners: DraggableSyntheticListeners | undefined;\n setActivatorNodeRef: (node: HTMLElement | null) => void;\n isDragging?: boolean;\n disabled?: boolean;\n}\n\nconst SortableItemContext =\n React.createContext<SortableItemContextValue | null>(null);\n\nfunction useSortableItemContext(consumerName: string) {\n const context = React.useContext(SortableItemContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``);\n }\n return context;\n}\n\ninterface SortableItemProps extends React.ComponentProps<\"div\"> {\n value: UniqueIdentifier;\n asHandle?: boolean;\n asChild?: boolean;\n disabled?: boolean;\n}\n\nfunction SortableItem(props: SortableItemProps) {\n const {\n value,\n style,\n asHandle,\n asChild,\n disabled,\n className,\n ref,\n ...itemProps\n } = props;\n\n const inSortableContent = React.useContext(SortableContentContext);\n const inSortableOverlay = React.useContext(SortableOverlayContext);\n\n if (!inSortableContent && !inSortableOverlay) {\n throw new Error(\n `\\`${ITEM_NAME}\\` must be used within \\`${CONTENT_NAME}\\` or \\`${OVERLAY_NAME}\\``,\n );\n }\n\n if (value === \"\") {\n throw new Error(`\\`${ITEM_NAME}\\` value cannot be an empty string`);\n }\n\n const context = useSortableContext(ITEM_NAME);\n const id = React.useId();\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: value, disabled });\n\n const composedRef = useComposedRefs(ref, (node) => {\n if (disabled) return;\n setNodeRef(node);\n if (asHandle) setActivatorNodeRef(node);\n });\n\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\n return {\n transform: CSS.Translate.toString(transform),\n transition,\n ...style,\n };\n }, [transform, transition, style]);\n\n const itemContext = React.useMemo<SortableItemContextValue>(\n () => ({\n id,\n attributes,\n listeners,\n setActivatorNodeRef,\n isDragging,\n disabled,\n }),\n [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled],\n );\n\n const ItemPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <SortableItemContext.Provider value={itemContext}>\n <ItemPrimitive\n id={id}\n data-disabled={disabled}\n data-dragging={isDragging ? \"\" : undefined}\n data-slot=\"sortable-item\"\n {...itemProps}\n {...(asHandle && !disabled ? attributes : {})}\n {...(asHandle && !disabled ? listeners : {})}\n ref={composedRef}\n style={composedStyle}\n className={cn(\n \"focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1\",\n {\n \"touch-none select-none\": asHandle,\n \"cursor-default\": context.flatCursor,\n \"data-dragging:cursor-grabbing\": !context.flatCursor,\n \"cursor-grab\": !isDragging && asHandle && !context.flatCursor,\n \"opacity-50\": isDragging,\n \"pointer-events-none opacity-50\": disabled,\n },\n className,\n )}\n />\n </SortableItemContext.Provider>\n );\n}\n\ninterface SortableItemHandleProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nfunction SortableItemHandle(props: SortableItemHandleProps) {\n const { asChild, disabled, className, ref, ...itemHandleProps } = props;\n\n const context = useSortableContext(ITEM_HANDLE_NAME);\n const itemContext = useSortableItemContext(ITEM_HANDLE_NAME);\n\n const isDisabled = disabled ?? itemContext.disabled;\n\n const composedRef = useComposedRefs(ref, (node) => {\n if (!isDisabled) return;\n itemContext.setActivatorNodeRef(node);\n });\n\n const HandlePrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <HandlePrimitive\n type=\"button\"\n aria-controls={itemContext.id}\n data-disabled={isDisabled}\n data-dragging={itemContext.isDragging ? \"\" : undefined}\n data-slot=\"sortable-item-handle\"\n {...itemHandleProps}\n {...(isDisabled ? {} : itemContext.attributes)}\n {...(isDisabled ? {} : itemContext.listeners)}\n ref={composedRef}\n className={cn(\n \"select-none disabled:pointer-events-none disabled:opacity-50\",\n context.flatCursor\n ? \"cursor-default\"\n : \"cursor-grab data-dragging:cursor-grabbing\",\n className,\n )}\n disabled={isDisabled}\n />\n );\n}\n\nconst SortableOverlayContext = React.createContext(false);\n\nconst dropAnimation: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: \"0.4\",\n },\n },\n }),\n};\n\ninterface SortableOverlayProps\n extends Omit<React.ComponentProps<typeof DragOverlay>, \"children\"> {\n container?: Element | DocumentFragment | null;\n children?:\n | ((params: { value: UniqueIdentifier }) => React.ReactNode)\n | React.ReactNode;\n}\n\nfunction SortableOverlay(props: SortableOverlayProps) {\n const { container: containerProp, children, ...overlayProps } = props;\n\n const context = useSortableContext(OVERLAY_NAME);\n\n const [mounted, setMounted] = React.useState(false);\n\n React.useLayoutEffect(() => setMounted(true), []);\n\n const container =\n containerProp ?? (mounted ? globalThis.document?.body : null);\n\n if (!container) return null;\n\n return ReactDOM.createPortal(\n <DragOverlay\n dropAnimation={dropAnimation}\n modifiers={context.modifiers}\n className={cn(!context.flatCursor && \"cursor-grabbing\")}\n {...overlayProps}\n >\n <SortableOverlayContext.Provider value={true}>\n {context.activeId\n ? typeof children === \"function\"\n ? children({ value: context.activeId })\n : children\n : null}\n </SortableOverlayContext.Provider>\n </DragOverlay>,\n container,\n );\n}\n\nexport {\n Sortable,\n SortableContent,\n SortableItem,\n SortableItemHandle,\n SortableOverlay,\n //\n type SortableProps,\n};\n","import * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === \"function\") {\n return ref(value);\n }\n if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup === \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup === \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n","import { useCallback, useRef, useState } from \"react\";\nimport type { ConversationFlowStep } from \"../../types\";\nimport { Button, Textarea } from \"@greatapps/greatauth-ui/ui\";\nimport {\n Sortable,\n SortableContent,\n SortableItem,\n SortableItemHandle,\n SortableOverlay,\n} from \"../ui/sortable\";\nimport { GripVertical, Plus, Trash2 } from \"lucide-react\";\n\ninterface StepWithKey extends ConversationFlowStep {\n _key: number;\n}\n\ninterface ConversationFlowEditorProps {\n steps: ConversationFlowStep[];\n onChange: (steps: ConversationFlowStep[]) => void;\n disabled?: boolean;\n}\n\nfunction renumber(steps: ConversationFlowStep[]): ConversationFlowStep[] {\n return steps.map((s, i) => ({ ...s, order: i + 1 }));\n}\n\nfunction stripKeys(steps: StepWithKey[]): ConversationFlowStep[] {\n return steps.map(({ _key, ...rest }) => rest);\n}\n\nexport function ConversationFlowEditor({\n steps,\n onChange,\n}: ConversationFlowEditorProps) {\n const nextKey = useRef(steps.length + 1);\n\n const [internal, setInternal] = useState<StepWithKey[]>(() =>\n steps.map((s, i) => ({ ...s, _key: i + 1 })),\n );\n\n const sync = useCallback(\n (next: StepWithKey[]) => {\n const renumbered = renumber(next).map((s, i) => ({\n ...s,\n _key: next[i]._key,\n })) as StepWithKey[];\n setInternal(renumbered);\n onChange(stripKeys(renumbered));\n },\n [onChange],\n );\n\n function handleAdd() {\n nextKey.current += 1;\n const newStep: StepWithKey = {\n order: internal.length + 1,\n instruction: \"\",\n example: null,\n _key: nextKey.current,\n };\n sync([...internal, newStep]);\n }\n\n function handleRemove(key: number) {\n sync(internal.filter((s) => s._key !== key));\n }\n\n function handleFieldChange(\n key: number,\n field: \"instruction\" | \"example\",\n value: string,\n ) {\n const next = internal.map((s) => {\n if (s._key !== key) return s;\n if (field === \"example\") {\n return { ...s, example: value || null };\n }\n return { ...s, [field]: value };\n });\n sync(next);\n }\n\n function handleReorder(newItems: StepWithKey[]) {\n sync(newItems);\n }\n\n return (\n <div className=\"space-y-3\">\n {internal.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma etapa definida. Adicione a primeira etapa do fluxo de\n conversa.\n </p>\n </div>\n ) : (\n <Sortable\n value={internal}\n onValueChange={handleReorder}\n getItemValue={(item) => item._key}\n >\n <SortableContent className=\"space-y-2\">\n {internal.map((step) => (\n <SortableItem\n key={step._key}\n value={step._key}\n className=\"flex flex-col gap-2 rounded-lg border bg-card p-3\"\n >\n <div className=\"flex items-center gap-2\">\n <SortableItemHandle className=\"shrink-0 cursor-grab text-muted-foreground hover:text-foreground\">\n <GripVertical aria-hidden=\"true\" className=\"h-4 w-4\" />\n </SortableItemHandle>\n <span className=\"shrink-0 text-xs font-medium text-muted-foreground tabular-nums\">\n {step.order}.\n </span>\n <span className=\"flex-1 text-sm font-medium truncate\">{step.instruction || \"Nova etapa\"}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Remover etapa\"\n className=\"shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={() => handleRemove(step._key)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"space-y-2 pl-8\">\n <Textarea\n value={step.instruction}\n onChange={(e) =>\n handleFieldChange(step._key, \"instruction\", e.target.value)\n }\n placeholder=\"Descreva o que o agente deve fazer nesta etapa...\"\n className=\"min-h-[2.5rem] resize-none\"\n rows={2}\n />\n <Textarea\n value={step.example ?? \"\"}\n onChange={(e) =>\n handleFieldChange(step._key, \"example\", e.target.value)\n }\n placeholder=\"Exemplo de resposta do agente (opcional)\"\n className=\"min-h-[2.5rem] resize-none text-muted-foreground\"\n rows={1}\n />\n </div>\n </SortableItem>\n ))}\n </SortableContent>\n <SortableOverlay>\n {({ value }) => {\n const step = internal.find((s) => s._key === value);\n return (\n <div className=\"flex items-center gap-2 rounded-lg border bg-card p-2 shadow-lg\">\n <GripVertical\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-muted-foreground\"\n />\n <span className=\"text-xs font-medium text-muted-foreground\">\n {step?.order}.\n </span>\n <span className=\"text-sm truncate\">\n {step?.instruction || \"Etapa sem instrução\"}\n </span>\n </div>\n );\n }}\n </SortableOverlay>\n </Sortable>\n )}\n\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleAdd}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Adicionar etapa\n </Button>\n </div>\n );\n}\n","import { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport type { Agent, ConversationFlowStep } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useUpdateAgent } from \"../../hooks\";\nimport { Button, Label } from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { ConversationFlowEditor } from \"./conversation-flow-editor\";\n\n// ---------------------------------------------------------------------------\n// Section config\n// ---------------------------------------------------------------------------\n\ninterface SectionDef {\n key: \"identity\" | \"mission\" | \"tone_style_format\" | \"rules\" | \"conversation_flow\" | \"context\";\n label: string;\n helper: string;\n placeholder: string;\n required?: boolean;\n field: keyof Agent;\n type: \"textarea\" | \"conversation_flow\";\n}\n\nconst SECTIONS: SectionDef[] = [\n {\n key: \"identity\",\n label: \"Identidade\",\n helper: \"Descreva quem é o agente, o seu nome e personalidade\",\n required: true,\n field: \"identity\",\n type: \"textarea\",\n placeholder: \"Você é a Ana, assistente virtual da Clínica Saúde & Bem-Estar. Você é simpática, profissional e sempre disposta a ajudar os pacientes...\",\n },\n {\n key: \"mission\",\n label: \"Missão\",\n helper: \"Qual é a missão principal deste agente\",\n required: true,\n field: \"mission\",\n type: \"textarea\",\n placeholder: \"Sua missão é ajudar pacientes a agendar consultas, tirar dúvidas sobre horários e especialidades, e fornecer informações sobre a clínica...\",\n },\n {\n key: \"tone_style_format\",\n label: \"Tom, Estilo & Formato\",\n helper: \"Defina como o agente comunica e formata as respostas\",\n required: false,\n field: \"tone_style_format\",\n type: \"textarea\",\n placeholder: \"Use tom empático e acolhedor. Responda de forma clara e objetiva, em no máximo 3 parágrafos. Use listas quando houver múltiplas opções...\",\n },\n {\n key: \"rules\",\n label: \"Regras\",\n helper: \"Limites, restrições e comportamentos obrigatórios\",\n required: false,\n field: \"rules\",\n type: \"textarea\",\n placeholder: \"Nunca forneça diagnósticos médicos. Sempre recomende consulta presencial para urgências. Não agende consultas fora do horário de funcionamento (08h-18h)...\",\n },\n {\n key: \"conversation_flow\",\n label: \"Fluxo de Conversa\",\n helper: \"Etapas que o agente segue no início de cada conversa\",\n required: false,\n field: \"conversation_flow\",\n type: \"conversation_flow\",\n placeholder: \"\",\n },\n {\n key: \"context\",\n label: \"Contexto\",\n helper: \"Informações adicionais que o agente deve saber\",\n required: false,\n field: \"context\",\n type: \"textarea\",\n placeholder: \"A clínica funciona de segunda a sexta, das 08h às 18h. Especialidades disponíveis: Cardiologia, Dermatologia, Ortopedia, Pediatria...\",\n },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction parseConversationFlow(raw: string | null | undefined): ConversationFlowStep[] {\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed;\n return [];\n } catch {\n return [];\n }\n}\n\nfunction computeTotals(fields: Record<string, string>, steps: ConversationFlowStep[]) {\n const textChars = Object.values(fields).reduce((sum, v) => sum + v.length, 0);\n const flowChars = JSON.stringify(steps).length;\n const total = textChars + flowChars;\n return { chars: total, tokens: Math.ceil(total / 4) };\n}\n\n// ---------------------------------------------------------------------------\n// Auto-resize textarea component\n// ---------------------------------------------------------------------------\n\nfunction AutoTextarea({\n value,\n onChange,\n disabled,\n placeholder,\n ariaLabel,\n}: {\n value: string;\n onChange: (v: string) => void;\n disabled?: boolean;\n placeholder?: string;\n ariaLabel?: string;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n\n const autoResize = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.max(120, el.scrollHeight)}px`;\n }, []);\n\n useEffect(() => {\n autoResize();\n }, [value, autoResize]);\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLTextAreaElement>) {\n if (e.key === \"Tab\") {\n e.preventDefault();\n const el = e.currentTarget;\n const start = el.selectionStart;\n const end = el.selectionEnd;\n const newValue = el.value.substring(0, start) + \" \" + el.value.substring(end);\n onChange(newValue);\n requestAnimationFrame(() => {\n el.selectionStart = el.selectionEnd = start + 2;\n });\n }\n }\n\n return (\n <textarea\n ref={ref}\n aria-label={ariaLabel}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full resize-none rounded-lg border bg-background p-3 text-sm leading-relaxed focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50\"\n style={{ minHeight: \"120px\" }}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// AgentDefinitionEditor\n// ---------------------------------------------------------------------------\n\ninterface AgentDefinitionEditorProps {\n agent: Agent;\n config: GagentsHookConfig;\n}\n\nexport function AgentDefinitionEditor({ agent, config }: AgentDefinitionEditorProps) {\n const updateAgent = useUpdateAgent(config);\n\n // Track agent ID to reset state on agent switch\n const [trackedAgentId, setTrackedAgentId] = useState(agent.id);\n\n // Text field state\n const [fields, setFields] = useState<Record<string, string>>(() => ({\n identity: agent.identity ?? \"\",\n mission: agent.mission ?? \"\",\n tone_style_format: agent.tone_style_format ?? \"\",\n rules: agent.rules ?? \"\",\n context: agent.context ?? \"\",\n }));\n\n // Conversation flow state\n const [conversationFlowSteps, setConversationFlowSteps] = useState<ConversationFlowStep[]>(\n () => parseConversationFlow(agent.conversation_flow),\n );\n\n // Reset state when agent changes\n if (trackedAgentId !== agent.id) {\n setTrackedAgentId(agent.id);\n setFields({\n identity: agent.identity ?? \"\",\n mission: agent.mission ?? \"\",\n tone_style_format: agent.tone_style_format ?? \"\",\n rules: agent.rules ?? \"\",\n context: agent.context ?? \"\",\n });\n setConversationFlowSteps(parseConversationFlow(agent.conversation_flow));\n }\n\n function updateField(key: string, value: string) {\n setFields((prev) => ({ ...prev, [key]: value }));\n }\n\n const { chars, tokens } = computeTotals(fields, conversationFlowSteps);\n\n const hasChanges = useMemo(() => {\n if (fields.identity !== (agent.identity ?? \"\")) return true;\n if (fields.mission !== (agent.mission ?? \"\")) return true;\n if (fields.tone_style_format !== (agent.tone_style_format ?? \"\")) return true;\n if (fields.rules !== (agent.rules ?? \"\")) return true;\n if (fields.context !== (agent.context ?? \"\")) return true;\n const originalSteps = parseConversationFlow(agent.conversation_flow);\n if (JSON.stringify(conversationFlowSteps) !== JSON.stringify(originalSteps)) return true;\n return false;\n }, [fields, conversationFlowSteps, agent]);\n\n function discard() {\n setFields({\n identity: agent.identity ?? \"\",\n mission: agent.mission ?? \"\",\n tone_style_format: agent.tone_style_format ?? \"\",\n rules: agent.rules ?? \"\",\n context: agent.context ?? \"\",\n });\n setConversationFlowSteps(parseConversationFlow(agent.conversation_flow));\n }\n\n async function handleSave() {\n if (!fields.identity.trim() || !fields.mission.trim()) {\n toast.error(\"Identidade e Missão são campos obrigatórios\");\n return;\n }\n\n const body: Record<string, unknown> = {\n identity: fields.identity.trim(),\n mission: fields.mission.trim(),\n tone_style_format: fields.tone_style_format.trim() || null,\n rules: fields.rules.trim() || null,\n conversation_flow: conversationFlowSteps.length > 0\n ? JSON.stringify(conversationFlowSteps)\n : null,\n context: fields.context.trim() || null,\n };\n\n try {\n await updateAgent.mutateAsync({ id: agent.id, body });\n toast.success(\"Definição do agente salva com sucesso\");\n } catch {\n toast.error(\"Erro ao salvar definição do agente\");\n }\n }\n\n return (\n <div className=\"space-y-6 p-4\">\n {/* Sections */}\n {SECTIONS.map((section) => (\n <div key={section.key} className=\"space-y-2\">\n <Label className=\"text-sm font-medium\">\n {section.label}\n {section.required && <span className=\"ml-0.5 text-destructive\">*</span>}\n </Label>\n <p className=\"text-xs text-muted-foreground\">{section.helper}</p>\n\n {section.type === \"textarea\" ? (\n <AutoTextarea\n value={fields[section.key] ?? \"\"}\n onChange={(v) => updateField(section.key, v)}\n disabled={updateAgent.isPending}\n placeholder={section.placeholder}\n ariaLabel={section.label}\n />\n ) : (\n <ConversationFlowEditor\n steps={conversationFlowSteps}\n onChange={setConversationFlowSteps}\n disabled={updateAgent.isPending}\n />\n )}\n </div>\n ))}\n\n {/* Character count + token estimate */}\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <span className=\"tabular-nums\">{chars.toLocaleString(\"pt-BR\")} caracteres</span>\n <span>·</span>\n <span className=\"tabular-nums\">~{tokens.toLocaleString(\"pt-BR\")} tokens</span>\n </div>\n\n {/* Sticky save/discard bar */}\n {hasChanges && (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-2 rounded-lg border bg-background p-3 shadow-sm\">\n <p className=\"text-sm text-muted-foreground\">Você tem alterações não salvas.</p>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={discard} disabled={updateAgent.isPending}>\n Descartar\n </Button>\n <Button size=\"sm\" onClick={handleSave} disabled={updateAgent.isPending}>\n {updateAgent.isPending && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Salvar\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport type { Agent, PromptVersion, ConversationFlowStep } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { usePromptVersions } from \"../../hooks\";\nimport {\n Button,\n Badge,\n Skeleton,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { FileText, RotateCcw, X, AlertTriangle } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ninterface AgentRevisionTabProps {\n agent: Agent;\n config: GagentsHookConfig;\n}\n\nconst STRUCTURED_MARKERS = [\"[IDENTIDADE]\", \"[MISSÃO]\", \"[TOM, ESTILO & FORMATO]\"];\n\nfunction formatDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"pt-BR\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction computeDiff(\n oldText: string,\n newText: string,\n): { type: \"added\" | \"removed\" | \"equal\"; line: string }[] {\n const oldLines = oldText.split(\"\\n\");\n const newLines = newText.split(\"\\n\");\n const result: { type: \"added\" | \"removed\" | \"equal\"; line: string }[] = [];\n const maxLen = Math.max(oldLines.length, newLines.length);\n\n for (let i = 0; i < maxLen; i++) {\n const oldLine = i < oldLines.length ? oldLines[i] : undefined;\n const newLine = i < newLines.length ? newLines[i] : undefined;\n\n if (oldLine === newLine) {\n result.push({ type: \"equal\", line: newLine! });\n } else {\n if (oldLine !== undefined) {\n result.push({ type: \"removed\", line: oldLine });\n }\n if (newLine !== undefined) {\n result.push({ type: \"added\", line: newLine });\n }\n }\n }\n\n return result;\n}\n\nfunction formatConversationFlow(raw: string | null): string {\n if (!raw) return \"\";\n try {\n const steps: ConversationFlowStep[] = JSON.parse(raw);\n if (!Array.isArray(steps) || steps.length === 0) return \"\";\n return steps\n .sort((a, b) => a.order - b.order)\n .map((s) => {\n let line = `${s.order}. ${s.instruction}`;\n if (s.example) line += `\\n Exemplo: ${s.example}`;\n return line;\n })\n .join(\"\\n\");\n } catch {\n // If it's not valid JSON, return raw text\n return raw;\n }\n}\n\nfunction buildAssembledPrompt(agent: Agent): string {\n const sections: string[] = [];\n\n if (agent.identity?.trim()) {\n sections.push(`[IDENTIDADE]\\n${agent.identity.trim()}`);\n }\n if (agent.mission?.trim()) {\n sections.push(`[MISSÃO]\\n${agent.mission.trim()}`);\n }\n if (agent.tone_style_format?.trim()) {\n sections.push(`[TOM, ESTILO & FORMATO]\\n${agent.tone_style_format.trim()}`);\n }\n if (agent.rules?.trim()) {\n sections.push(`[REGRAS]\\n${agent.rules.trim()}`);\n }\n\n const flowFormatted = formatConversationFlow(agent.conversation_flow);\n if (flowFormatted) {\n sections.push(`[FLUXO DE CONVERSA]\\n${flowFormatted}`);\n }\n\n if (agent.context?.trim()) {\n sections.push(`[CONTEXTO]\\n${agent.context.trim()}`);\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nfunction isLegacyVersion(version: PromptVersion): boolean {\n const content = version.prompt_content ?? \"\";\n return !STRUCTURED_MARKERS.some((marker) => content.includes(marker));\n}\n\nexport function AgentRevisionTab({ agent, config }: AgentRevisionTabProps) {\n const { data: versionsData, isLoading } = usePromptVersions(config, agent.id);\n\n const [compareVersionId, setCompareVersionId] = useState<number | null>(null);\n const [legacyModalVersion, setLegacyModalVersion] = useState<PromptVersion | null>(null);\n\n const versions = (versionsData?.data || []) as PromptVersion[];\n const sortedVersions = [...versions].sort(\n (a, b) => new Date(b.datetime_add).getTime() - new Date(a.datetime_add).getTime(),\n );\n const currentVersion = sortedVersions.find((v) => v.is_current) || sortedVersions[0] || null;\n\n const assembledPrompt = useMemo(() => buildAssembledPrompt(agent), [\n agent.identity,\n agent.mission,\n agent.tone_style_format,\n agent.rules,\n agent.conversation_flow,\n agent.context,\n ]);\n\n const charCount = assembledPrompt.length;\n const tokenEstimate = Math.ceil(charCount / 4);\n\n const compareVersion = sortedVersions.find((v) => v.id === compareVersionId);\n\n const diffLines =\n currentVersion && compareVersion && compareVersion.id !== currentVersion.id\n ? computeDiff(compareVersion.prompt_content ?? \"\", currentVersion.prompt_content ?? \"\")\n : null;\n\n function handleRestore(version: PromptVersion) {\n if (isLegacyVersion(version)) {\n setLegacyModalVersion(version);\n } else {\n toast.info(\"Restaurar versão estruturada — funcionalidade em desenvolvimento\");\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3 p-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-14 w-full\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4 p-4 lg:flex-row\">\n {/* Left: Preview + Diff */}\n <div className=\"min-w-0 flex-1 space-y-4\">\n {/* Assembled prompt preview */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n Preview do Prompt Montado\n </h3>\n <div className=\"rounded-lg border\">\n <pre className=\"max-h-[32rem] overflow-auto whitespace-pre-wrap p-4 font-mono text-sm leading-relaxed\">\n {assembledPrompt ? (\n assembledPrompt.split(\"\\n\").map((line, i) => {\n const isSectionHeader = /^\\[.+\\]$/.test(line.trim());\n return (\n <span\n key={i}\n className={isSectionHeader ? \"font-bold text-foreground\" : \"\"}\n >\n {line}\n {\"\\n\"}\n </span>\n );\n })\n ) : (\n <span className=\"italic text-muted-foreground\">\n Nenhum campo estruturado preenchido.\n </span>\n )}\n </pre>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <span className=\"tabular-nums\">{charCount.toLocaleString(\"pt-BR\")} caracteres</span>\n <span>·</span>\n <span className=\"tabular-nums\">~{tokenEstimate.toLocaleString(\"pt-BR\")} tokens</span>\n </div>\n </div>\n\n {/* Diff panel (conditional) */}\n {diffLines && compareVersion && currentVersion && (\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n Diferenças: v{compareVersion.version_number} → v{currentVersion.version_number} (actual)\n </h3>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setCompareVersionId(null)}\n className=\"text-xs\"\n >\n <X className=\"mr-1 h-3 w-3\" />\n Fechar\n </Button>\n </div>\n <div className=\"max-h-64 overflow-auto rounded-lg border font-mono text-sm\">\n {diffLines.map((line, i) => (\n <div\n key={i}\n className={`whitespace-pre-wrap px-3 py-0.5 ${\n line.type === \"added\"\n ? \"bg-green-500/10 text-green-700 dark:text-green-400\"\n : line.type === \"removed\"\n ? \"bg-red-500/10 text-red-700 dark:text-red-400\"\n : \"\"\n }`}\n >\n <span className=\"mr-2 inline-block w-4 select-none text-muted-foreground\">\n {line.type === \"added\" ? \"+\" : line.type === \"removed\" ? \"-\" : \" \"}\n </span>\n {line.line || \" \"}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Right: Version history timeline */}\n <div className=\"w-full space-y-2 lg:w-80 lg:shrink-0\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n Histórico de Versões\n </h3>\n {sortedVersions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <FileText className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma versão encontrada.\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {sortedVersions.map((version) => {\n const isCurrent = currentVersion?.id === version.id;\n const isComparing = version.id === compareVersionId;\n return (\n <div\n key={version.id}\n className={`rounded-lg border p-3 transition-colors ${\n isCurrent\n ? \"border-primary bg-primary/5\"\n : isComparing\n ? \"border-muted-foreground/30 bg-muted/50\"\n : \"\"\n }`}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-medium\">\n v{version.version_number}\n </span>\n {isCurrent && (\n <Badge variant=\"default\" className=\"text-[10px] px-1.5 py-0\">\n Actual\n </Badge>\n )}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {formatDate(version.datetime_add)}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{(version.prompt_content ?? \"\").length} chars</span>\n <span>·</span>\n <span className=\"truncate font-mono\">\n {(version.prompt_hash ?? \"\").slice(0, 8)}\n </span>\n </div>\n {version.change_notes && (\n <div className=\"mt-1.5 text-xs italic text-muted-foreground\">\n {version.change_notes}\n </div>\n )}\n {!isCurrent && (\n <div className=\"mt-2 flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => setCompareVersionId(isComparing ? null : version.id)}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n <FileText aria-hidden=\"true\" className=\"h-3 w-3\" />\n {isComparing ? \"Ocultar diff\" : \"Comparar\"}\n </button>\n <button\n type=\"button\"\n onClick={() => handleRestore(version)}\n className=\"flex items-center gap-1 text-xs text-primary hover:underline\"\n >\n <RotateCcw aria-hidden=\"true\" className=\"h-3 w-3\" />\n Restaurar\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Legacy version modal */}\n <Dialog\n open={!!legacyModalVersion}\n onOpenChange={(open) => {\n if (!open) setLegacyModalVersion(null);\n }}\n >\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-amber-500\" />\n Versão Legada — v{legacyModalVersion?.version_number}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-3\">\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-3\">\n <p className=\"text-sm text-amber-700 dark:text-amber-400\">\n Esta versão foi criada antes da reestruturação e não pode ser restaurada nos campos estruturados.\n </p>\n </div>\n <div className=\"max-h-96 overflow-auto rounded-lg border p-4\">\n <pre className=\"whitespace-pre-wrap font-mono text-sm leading-relaxed\">\n {legacyModalVersion?.prompt_content ?? \"\"}\n </pre>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <span>\n {(legacyModalVersion?.prompt_content ?? \"\").length.toLocaleString(\"pt-BR\")} caracteres\n </span>\n {legacyModalVersion?.change_notes && (\n <>\n <span>·</span>\n <span className=\"italic\">{legacyModalVersion.change_notes}</span>\n </>\n )}\n </div>\n </div>\n <div className=\"flex justify-end pt-2\">\n <Button variant=\"outline\" onClick={() => setLegacyModalVersion(null)}>\n Fechar\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { Conversation } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Skeleton,\n Badge,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { MessageCircle, ExternalLink } from \"lucide-react\";\nimport { ConversationView } from \"./conversation-view\";\n\ninterface AgentConversationsTableProps {\n conversations: Conversation[];\n isLoading: boolean;\n contactsMap?: Map<number, string>;\n objectivesMap?: Map<number, string>;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nfunction formatRelativeDate(dateStr: string | null): string {\n if (!dateStr) return \"—\";\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return \"agora\";\n if (diffMin < 60) return `${diffMin}m atrás`;\n const diffHours = Math.floor(diffMin / 60);\n if (diffHours < 24) return `${diffHours}h atrás`;\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 30) return `${diffDays}d atrás`;\n return date.toLocaleDateString(\"pt-BR\");\n}\n\nexport function AgentConversationsTable({\n conversations,\n isLoading,\n contactsMap,\n objectivesMap,\n config,\n renderChatLink,\n}: AgentConversationsTableProps) {\n const [selectedId, setSelectedId] = useState<number | null>(null);\n\n if (isLoading) {\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full\" />\n ))}\n </div>\n );\n }\n\n if (conversations.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <MessageCircle className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma conversa encontrada.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>ID</TableHead>\n <TableHead>Contato</TableHead>\n <TableHead>Objetivo</TableHead>\n <TableHead className=\"text-right\">Mensagens</TableHead>\n <TableHead className=\"text-right\">Tokens</TableHead>\n <TableHead>Criado em</TableHead>\n <TableHead>Atualizado em</TableHead>\n <TableHead className=\"w-10\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {conversations.map((conversation) => (\n <TableRow\n key={conversation.id}\n className=\"cursor-pointer\"\n role=\"button\"\n tabIndex={0}\n onClick={() =>\n setSelectedId(\n selectedId === conversation.id ? null : conversation.id,\n )\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setSelectedId(\n selectedId === conversation.id ? null : conversation.id,\n );\n }\n }}\n data-state={selectedId === conversation.id ? \"selected\" : undefined}\n >\n <TableCell className=\"font-mono text-xs\">\n {conversation.id}\n </TableCell>\n <TableCell>\n {contactsMap?.get(conversation.id_contact) ?? conversation.id_contact}\n </TableCell>\n <TableCell>\n {conversation.id_objective && objectivesMap?.get(conversation.id_objective) ? (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {objectivesMap.get(conversation.id_objective)}\n </Badge>\n ) : (\n <span className=\"text-xs text-muted-foreground\">—</span>\n )}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">\n {conversation.message_count ?? \"—\"}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">\n {conversation.usage_tokens ?? \"—\"}\n </TableCell>\n <TableCell>\n {new Date(conversation.datetime_add).toLocaleDateString(\"pt-BR\")}\n </TableCell>\n <TableCell>\n {formatRelativeDate(conversation.datetime_alt)}\n </TableCell>\n <TableCell>\n {conversation.id_external ? (\n renderChatLink ? (\n <span onClick={(e) => e.stopPropagation()}>\n {renderChatLink(conversation.id_external)}\n </span>\n ) : (\n <a\n href={`/gchat/inbox/${conversation.id_external}`}\n title=\"Ver no Chat\"\n aria-label=\"Ver no Chat\"\n onClick={(e) => e.stopPropagation()}\n className=\"inline-flex items-center justify-center rounded-md p-1.5 text-muted-foreground hover:text-foreground hover:bg-accent transition-colors\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )\n ) : null}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n\n {selectedId && (\n <ConversationView\n conversationId={selectedId}\n onClose={() => setSelectedId(null)}\n contactsMap={contactsMap}\n config={config}\n renderChatLink={renderChatLink}\n />\n )}\n </div>\n );\n}\n","import { useConversation } from \"../../hooks\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { Skeleton, Button } from \"@greatapps/greatauth-ui/ui\";\nimport { X, MessageSquare } from \"lucide-react\";\n\ninterface ConversationViewProps {\n conversationId: number;\n onClose: () => void;\n contactsMap?: Map<number, string>;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nfunction formatDateTime(dateStr: string | null): string {\n if (!dateStr) return \"—\";\n return new Date(dateStr).toLocaleString(\"pt-BR\");\n}\n\nexport function ConversationView({\n conversationId,\n onClose,\n contactsMap,\n config,\n renderChatLink,\n}: ConversationViewProps) {\n const { data: conversation, isLoading } = useConversation(config, conversationId);\n\n if (isLoading) {\n return (\n <div className=\"rounded-lg border bg-card p-4 space-y-3\">\n <Skeleton className=\"h-6 w-48\" />\n <div className=\"grid grid-cols-2 gap-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-10 w-full\" />\n ))}\n </div>\n </div>\n );\n }\n\n if (!conversation) {\n return (\n <div className=\"rounded-lg border bg-card p-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Conversa não encontrada.\n </p>\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Fechar\" onClick={onClose}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg border bg-card p-4 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold\">Detalhes da conversa #{conversation.id}</h3>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Fechar\" onClick={onClose}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {conversation.id_external ? (\n renderChatLink ? (\n renderChatLink(conversation.id_external)\n ) : (\n <Button variant=\"outline\" size=\"sm\" asChild>\n <a href={`/gchat/inbox/${conversation.id_external}`}>\n <MessageSquare className=\"mr-2 h-4 w-4\" />\n Ver no Chat\n </a>\n </Button>\n )\n ) : null}\n\n <div className=\"grid grid-cols-2 gap-x-6 gap-y-3 text-sm\">\n <div>\n <span className=\"text-muted-foreground\">Thread ID</span>\n <p className=\"font-mono text-xs mt-0.5\">\n {conversation.openai_thread_id || \"—\"}\n </p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Contato</span>\n <p className=\"mt-0.5\">\n {contactsMap?.get(conversation.id_contact) ?? conversation.id_contact}\n </p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Agente</span>\n <p className=\"mt-0.5\">{conversation.id_agent ?? \"—\"}</p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Mensagens</span>\n <p className=\"mt-0.5\">{conversation.message_count ?? \"—\"}</p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Tokens</span>\n <p className=\"mt-0.5\">{conversation.usage_tokens ?? \"—\"}</p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Rotações de Thread</span>\n <p className=\"mt-0.5\">{conversation.rotation_count ?? \"—\"}</p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Criado em</span>\n <p className=\"mt-0.5\">\n {formatDateTime(conversation.datetime_add)}\n </p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Atualizado em</span>\n <p className=\"mt-0.5\">\n {formatDateTime(conversation.datetime_alt)}\n </p>\n </div>\n </div>\n </div>\n );\n}\n","import type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useAgentConversations, useGagentsContacts, useObjectives } from \"../../hooks\";\nimport { AgentConversationsTable } from \"./agent-conversations-table\";\n\ninterface AgentConversationsPanelProps {\n agent: Agent;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nexport function AgentConversationsPanel({\n agent,\n config,\n renderChatLink,\n}: AgentConversationsPanelProps) {\n const { data: conversationsData, isLoading } = useAgentConversations(\n config,\n agent.id,\n );\n const { data: contactsData } = useGagentsContacts(config);\n const { data: objectivesData } = useObjectives(config, agent.id);\n\n const conversations = conversationsData?.data || [];\n const contactsMap = new Map(\n (contactsData?.data || []).map((c) => [c.id, c.name]),\n );\n const objectivesMap = new Map(\n (objectivesData?.data || []).map((o) => [o.id, o.title]),\n );\n\n return (\n <div className=\"p-4\">\n <AgentConversationsTable\n conversations={conversations}\n isLoading={isLoading}\n contactsMap={contactsMap}\n objectivesMap={objectivesMap}\n config={config}\n renderChatLink={renderChatLink}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n useCapabilities,\n useAgentCapabilities,\n useUpdateAgentCapabilities,\n} from \"../../hooks\";\nimport type {\n CapabilityCategory,\n CapabilityModule,\n AgentCapability,\n AgentCapabilitiesPayload,\n} from \"../../types/capabilities\";\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n Switch,\n Checkbox,\n Badge,\n Button,\n Skeleton,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n CalendarCheck,\n Users,\n Settings,\n HeartHandshake,\n Package,\n ChevronDown,\n Loader2,\n Pencil,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"../../lib\";\n\n// ---------------------------------------------------------------------------\n// Operation label mapping (pt-BR) — NEW naming convention\n// ---------------------------------------------------------------------------\n\nconst OPERATION_LABELS: Record<string, string> = {\n list: \"Buscar\",\n view: \"Visualizar\",\n create: \"Criar\",\n update: \"Atualizar\",\n};\n\n/** Map old operation slug to new function name prefix */\nconst OPERATION_PREFIX: Record<string, string> = {\n list: \"search\",\n view: \"view\",\n create: \"create\",\n update: \"update\",\n};\n\nfunction getOperationLabel(slug: string): string {\n return OPERATION_LABELS[slug] ?? slug;\n}\n\n/** Build the new function slug: search_gclinic_{module}, create_gclinic_{module}, etc. */\nfunction getOperationFunctionSlug(opSlug: string, moduleSlug: string): string {\n const prefix = OPERATION_PREFIX[opSlug] ?? opSlug;\n return `${prefix}_gclinic_${moduleSlug}`;\n}\n\n/** Default instruction for an operation */\nfunction getDefaultInstruction(opSlug: string, moduleLabel: string): string {\n switch (opSlug) {\n case \"list\":\n return `Buscar ${moduleLabel.toLowerCase()} com filtros`;\n case \"view\":\n return `Visualizar detalhes de ${moduleLabel.toLowerCase()}`;\n case \"create\":\n return `Criar novo(a) ${moduleLabel.toLowerCase()}`;\n case \"update\":\n return `Atualizar ${moduleLabel.toLowerCase()} existente`;\n default:\n return `${getOperationLabel(opSlug)} ${moduleLabel.toLowerCase()}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Category icon mapping\n// ---------------------------------------------------------------------------\n\nconst CATEGORY_ICONS: Record<string, React.ElementType> = {\n agenda: CalendarCheck,\n cadastros: Users,\n infraestrutura: Settings,\n relacionamentos: HeartHandshake,\n};\n\nfunction getCategoryIcon(slug: string): React.ElementType {\n return CATEGORY_ICONS[slug] ?? Package;\n}\n\n// ---------------------------------------------------------------------------\n// Internal state helpers\n// ---------------------------------------------------------------------------\n\n/** Map from module slug -> set of enabled operation slugs */\ntype CapabilityState = Map<string, Set<string>>;\n\n/** Map from module slug -> { operation slug -> instruction text } */\ntype InstructionsState = Map<string, Record<string, string>>;\n\nfunction buildStateFromAgent(agentCaps: AgentCapability[]): CapabilityState {\n const state: CapabilityState = new Map();\n for (const cap of agentCaps) {\n state.set(cap.module, new Set(cap.operations));\n }\n return state;\n}\n\nfunction buildInstructionsFromAgent(agentCaps: AgentCapability[]): InstructionsState {\n const state: InstructionsState = new Map();\n for (const cap of agentCaps) {\n if (cap.instructions) {\n state.set(cap.module, { ...cap.instructions });\n }\n }\n return state;\n}\n\nfunction stateToPayload(state: CapabilityState, instructions: InstructionsState): AgentCapabilitiesPayload {\n const capabilities: AgentCapability[] = [];\n state.forEach((ops, mod) => {\n if (ops.size > 0) {\n const modInstructions = instructions.get(mod);\n const cap: AgentCapability = { module: mod, operations: Array.from(ops) };\n if (modInstructions && Object.keys(modInstructions).length > 0) {\n cap.instructions = modInstructions;\n }\n capabilities.push(cap);\n }\n });\n return { capabilities };\n}\n\nfunction cloneState(state: CapabilityState): CapabilityState {\n const next: CapabilityState = new Map();\n state.forEach((ops, mod) => next.set(mod, new Set(ops)));\n return next;\n}\n\nfunction cloneInstructions(state: InstructionsState): InstructionsState {\n const next: InstructionsState = new Map();\n state.forEach((instr, mod) => next.set(mod, { ...instr }));\n return next;\n}\n\nfunction statesEqual(a: CapabilityState, b: CapabilityState): boolean {\n // Compare only modules that have operations (non-empty sets)\n const aEffective = new Map([...a].filter(([, ops]) => ops.size > 0));\n const bEffective = new Map([...b].filter(([, ops]) => ops.size > 0));\n\n if (aEffective.size !== bEffective.size) return false;\n for (const [mod, opsA] of aEffective) {\n const opsB = bEffective.get(mod);\n if (!opsB || opsA.size !== opsB.size) return false;\n for (const op of opsA) {\n if (!opsB.has(op)) return false;\n }\n }\n return true;\n}\n\nfunction instructionsEqual(a: InstructionsState, b: InstructionsState, activeModules: CapabilityState): boolean {\n // Only compare instructions for modules that are active in the current state.\n // Orphaned instructions (for disabled modules) are irrelevant.\n const relevantModules = new Set([...activeModules.keys()].filter(k => (activeModules.get(k)?.size ?? 0) > 0));\n\n for (const mod of relevantModules) {\n const instrA = a.get(mod) ?? {};\n const instrB = b.get(mod) ?? {};\n const keysA = Object.keys(instrA);\n const keysB = Object.keys(instrB);\n if (keysA.length !== keysB.length) return false;\n for (const k of keysA) {\n if (instrA[k] !== instrB[k]) return false;\n }\n }\n\n // Also check if server had instructions for modules that are now active but local doesn't\n for (const mod of relevantModules) {\n const instrA = a.get(mod);\n const instrB = b.get(mod);\n const hasA = instrA && Object.keys(instrA).length > 0;\n const hasB = instrB && Object.keys(instrB).length > 0;\n if (hasA !== hasB) return false;\n }\n\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface CapabilitiesTabProps {\n config: GagentsHookConfig;\n agentId: number;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function CapabilitiesTab({ config, agentId }: CapabilitiesTabProps) {\n const { data: registry, isLoading: isLoadingRegistry } = useCapabilities(config);\n const { data: agentCaps, isLoading: isLoadingAgent } = useAgentCapabilities(config, agentId);\n const updateMutation = useUpdateAgentCapabilities(config);\n\n // Local state for optimistic updates\n const [localState, setLocalState] = useState<CapabilityState>(new Map());\n const [serverState, setServerState] = useState<CapabilityState>(new Map());\n const [localInstructions, setLocalInstructions] = useState<InstructionsState>(new Map());\n const [serverInstructions, setServerInstructions] = useState<InstructionsState>(new Map());\n const [initialized, setInitialized] = useState(false);\n\n // Sync server data into local state on first load / refetch\n useEffect(() => {\n if (agentCaps && !initialized) {\n const state = buildStateFromAgent(agentCaps);\n const instr = buildInstructionsFromAgent(agentCaps);\n setLocalState(state);\n setServerState(cloneState(state));\n setLocalInstructions(instr);\n setServerInstructions(cloneInstructions(instr));\n setInitialized(true);\n }\n }, [agentCaps, initialized]);\n\n // Reset initialized when agentId changes\n useEffect(() => {\n setInitialized(false);\n }, [agentId]);\n\n const hasChanges = useMemo(\n () =>\n initialized &&\n (!statesEqual(localState, serverState) || !instructionsEqual(localInstructions, serverInstructions, localState)),\n [localState, serverState, localInstructions, serverInstructions, initialized],\n );\n\n // ------ State mutation helpers ------\n const updateState = useCallback(\n (updater: (prev: CapabilityState) => CapabilityState) => {\n setLocalState((prev) => updater(prev));\n },\n [],\n );\n\n const toggleModule = useCallback(\n (mod: CapabilityModule, enabled: boolean) => {\n updateState((prev) => {\n const next = cloneState(prev);\n if (enabled) {\n next.set(mod.slug, new Set(mod.operations));\n } else {\n next.delete(mod.slug);\n }\n return next;\n });\n },\n [updateState],\n );\n\n const toggleOperation = useCallback(\n (mod: CapabilityModule, opSlug: string, enabled: boolean) => {\n updateState((prev) => {\n const next = cloneState(prev);\n const ops = new Set(next.get(mod.slug) ?? []);\n if (enabled) {\n ops.add(opSlug);\n } else {\n ops.delete(opSlug);\n }\n if (ops.size > 0) {\n next.set(mod.slug, ops);\n } else {\n next.delete(mod.slug);\n }\n return next;\n });\n },\n [updateState],\n );\n\n const updateOperationInstruction = useCallback(\n (moduleSlug: string, opSlug: string, instruction: string) => {\n setLocalInstructions((prev) => {\n const next = cloneInstructions(prev);\n const modInstr = next.get(moduleSlug) ?? {};\n modInstr[opSlug] = instruction;\n next.set(moduleSlug, modInstr);\n return next;\n });\n },\n [],\n );\n\n const enableAll = useCallback(() => {\n if (!registry) return;\n updateState(() => {\n const next: CapabilityState = new Map();\n for (const cat of registry.categories) {\n for (const mod of cat.modules) {\n next.set(mod.slug, new Set(mod.operations));\n }\n }\n return next;\n });\n }, [registry, updateState]);\n\n const disableAll = useCallback(() => {\n updateState(() => new Map());\n }, [updateState]);\n\n const discard = useCallback(() => {\n setLocalState(cloneState(serverState));\n setLocalInstructions(cloneInstructions(serverInstructions));\n }, [serverState, serverInstructions]);\n\n const saveNow = useCallback(() => {\n const payload = stateToPayload(localState, localInstructions);\n updateMutation.mutate(\n { agentId, payload },\n {\n onSuccess: () => {\n setServerState(cloneState(localState));\n setServerInstructions(cloneInstructions(localInstructions));\n toast.success(\"Capacidades salvas\");\n },\n onError: () => {\n setLocalState(cloneState(serverState));\n setLocalInstructions(cloneInstructions(serverInstructions));\n toast.error(\"Erro ao salvar capacidades\");\n },\n },\n );\n }, [agentId, localState, localInstructions, serverState, serverInstructions, updateMutation]);\n\n // ------ Counting helpers ------\n function countActiveModules(cat: CapabilityCategory): number {\n return cat.modules.filter((m) => (localState.get(m.slug)?.size ?? 0) > 0).length;\n }\n\n // ------ Loading state ------\n if (isLoadingRegistry || isLoadingAgent) {\n return (\n <div className=\"space-y-3\">\n {[1, 2, 3, 4].map((i) => (\n <Skeleton key={i} className=\"h-14 w-full\" />\n ))}\n </div>\n );\n }\n\n // ------ Empty state ------\n if (!registry || !registry.categories.length) {\n return (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Package className=\"h-12 w-12 text-muted-foreground mb-3\" />\n <h3 className=\"text-base font-medium\">Nenhuma capacidade disponível</h3>\n <p className=\"text-sm text-muted-foreground mt-1 max-w-sm\">\n Este produto ainda não possui capacidades registadas. As capacidades serão\n adicionadas automaticamente quando o produto for configurado.\n </p>\n </div>\n );\n }\n\n // ------ Render ------\n return (\n <div className=\"space-y-4\">\n {/* Header with global actions */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-medium\">Capacidades do agente</h3>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Ative ou desative módulos e operações disponíveis para este agente.\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={enableAll}>\n Ativar tudo\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={disableAll}>\n Desativar tudo\n </Button>\n </div>\n </div>\n\n {/* Category accordions */}\n <Accordion type=\"multiple\" className=\"space-y-2\">\n {registry.categories.map((cat) => {\n const Icon = getCategoryIcon(cat.slug);\n const activeCount = countActiveModules(cat);\n const totalModules = cat.modules.length;\n\n return (\n <AccordionItem\n key={cat.slug}\n value={cat.slug}\n className=\"border rounded-lg px-4\"\n >\n <AccordionTrigger className=\"hover:no-underline py-3\">\n <div className=\"flex items-center gap-3 flex-1\">\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm\">{cat.label}</span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {activeCount} de {totalModules} módulos ativos\n </Badge>\n </div>\n </AccordionTrigger>\n <AccordionContent className=\"pb-3 !h-auto\">\n <div className=\"space-y-1\">\n {cat.modules.map((mod) => {\n const enabledOps = localState.get(mod.slug);\n const isModuleOn = (enabledOps?.size ?? 0) > 0;\n const allOpsEnabled =\n enabledOps?.size === mod.operations.length;\n const modInstructions = localInstructions.get(mod.slug) ?? {};\n\n return (\n <ModuleRow\n key={mod.slug}\n module={mod}\n isOn={isModuleOn}\n allOpsEnabled={allOpsEnabled}\n enabledOps={enabledOps ?? new Set()}\n instructions={modInstructions}\n onToggleModule={(on) => toggleModule(mod, on)}\n onToggleOperation={(op, on) =>\n toggleOperation(mod, op, on)\n }\n onUpdateInstruction={(op, instr) =>\n updateOperationInstruction(mod.slug, op, instr)\n }\n />\n );\n })}\n </div>\n </AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n\n {/* Save bar */}\n {hasChanges && (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-2 rounded-lg border bg-background p-3 shadow-sm\">\n <p className=\"text-sm text-muted-foreground\">Você tem alterações não salvas.</p>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={discard} disabled={updateMutation.isPending}>\n Descartar\n </Button>\n <Button size=\"sm\" onClick={saveNow} disabled={updateMutation.isPending}>\n {updateMutation.isPending && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Salvar\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ModuleRow sub-component\n// ---------------------------------------------------------------------------\n\ninterface ModuleRowProps {\n module: CapabilityModule;\n isOn: boolean;\n allOpsEnabled: boolean;\n enabledOps: Set<string>;\n instructions: Record<string, string>;\n onToggleModule: (on: boolean) => void;\n onToggleOperation: (op: string, on: boolean) => void;\n onUpdateInstruction: (op: string, instruction: string) => void;\n}\n\nfunction ModuleRow({\n module: mod,\n isOn,\n enabledOps,\n instructions,\n onToggleModule,\n onToggleOperation,\n onUpdateInstruction,\n}: ModuleRowProps) {\n const [expanded, setExpanded] = useState(false);\n // Track which operation's instruction editor is open\n const [editingOp, setEditingOp] = useState<string | null>(null);\n\n return (\n <div className=\"rounded-md border px-3 py-2\">\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2 flex-1 text-left\"\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n aria-label={`Expandir ${mod.label}`}\n >\n <ChevronDown\n className={`h-3.5 w-3.5 text-muted-foreground transition-transform ${\n expanded ? \"rotate-0\" : \"-rotate-90\"\n }`}\n />\n <span className=\"text-sm font-medium\">{mod.label}</span>\n {mod.description && (\n <span className=\"text-xs text-muted-foreground hidden sm:inline\">\n — {mod.description}\n </span>\n )}\n {isOn && (\n <Badge variant=\"secondary\" className=\"text-xs ml-1\">\n {enabledOps.size}/{mod.operations.length}\n </Badge>\n )}\n </button>\n <Switch\n checked={isOn}\n onCheckedChange={onToggleModule}\n aria-label={`Ativar módulo ${mod.label}`}\n />\n </div>\n\n {expanded && (\n <div className=\"mt-2 ml-6 space-y-1.5 pb-1\">\n {mod.operations.map((op) => {\n const checked = enabledOps.has(op);\n const fnSlug = getOperationFunctionSlug(op, mod.slug);\n const isEditing = editingOp === op;\n const currentInstruction = instructions[op] ?? getDefaultInstruction(op, mod.label);\n\n return (\n <div key={op} className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5\">\n <Checkbox\n checked={checked}\n onCheckedChange={(val) =>\n onToggleOperation(op, val === true)\n }\n aria-label={`${getOperationLabel(op)} em ${mod.label}`}\n />\n <span className={cn(\"text-sm\", checked ? \"\" : \"text-muted-foreground\")}>\n {getOperationLabel(op)}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n ({fnSlug})\n </span>\n <button\n type=\"button\"\n className=\"p-0.5 rounded hover:bg-muted/50 transition-colors ml-auto\"\n onClick={() => setEditingOp(isEditing ? null : op)}\n aria-label={`Editar instruções de ${getOperationLabel(op)}`}\n >\n <Pencil className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n </div>\n\n {/* Inline instruction editor */}\n {isEditing && (\n <div className=\"ml-5\">\n <textarea\n className=\"w-full rounded-md border bg-background px-3 py-2 text-sm resize-y min-h-[56px] focus:outline-none focus:ring-1 focus:ring-ring\"\n value={currentInstruction}\n onChange={(e) => onUpdateInstruction(op, e.target.value)}\n placeholder=\"Instruções personalizadas para esta operação...\"\n rows={2}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useState, useEffect, useMemo } from \"react\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useIntegrationState } from \"../../hooks/use-integrations\";\nimport { useAgentTools, useAddAgentTool, useRemoveAgentTool, useUpdateAgentTool } from \"../../hooks/use-agent-tools\";\nimport { useCreateTool, useTools } from \"../../hooks/use-tools\";\nimport { Switch, Tooltip, TooltipContent, TooltipTrigger, Checkbox, Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plug, Loader2, ChevronDown, Pencil } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { CalendarSync } from \"lucide-react\";\nimport { cn } from \"../../lib\";\nimport type { IntegrationCardData } from \"../../hooks/use-integrations\";\nimport type { Tool } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Icon mapping\n// ---------------------------------------------------------------------------\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n CalendarSync,\n Plug,\n};\n\nfunction resolveIcon(name: string): LucideIcon {\n return ICON_MAP[name] ?? Plug;\n}\n\n// ---------------------------------------------------------------------------\n// Integration functions registry\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationFunction {\n slug: string;\n label: string;\n description: string;\n defaultInstructions: string;\n}\n\nconst INTEGRATION_FUNCTIONS: Record<string, IntegrationFunction[]> = {\n \"google-calendar\": [\n { slug: \"search_google_calendar_events\", label: \"Buscar Eventos\", description: \"Listar eventos do calendário\", defaultInstructions: \"Buscar eventos no Google Calendar do usuário\" },\n { slug: \"create_google_calendar_event\", label: \"Criar Evento\", description: \"Criar novo evento no calendário\", defaultInstructions: \"Criar novo evento no Google Calendar\" },\n { slug: \"update_google_calendar_event\", label: \"Atualizar Evento\", description: \"Editar evento existente\", defaultInstructions: \"Atualizar evento existente no Google Calendar\" },\n { slug: \"delete_google_calendar_event\", label: \"Remover Evento\", description: \"Cancelar/remover evento\", defaultInstructions: \"Remover evento do Google Calendar\" },\n ],\n};\n\n// ---------------------------------------------------------------------------\n// Build custom_instructions from selected functions\n// ---------------------------------------------------------------------------\n\nfunction buildCustomInstructions(\n integrationSlug: string,\n integrationName: string,\n selectedFunctions: Set<string>,\n functionInstructions: Record<string, string>,\n): string {\n const fns = INTEGRATION_FUNCTIONS[integrationSlug];\n if (!fns) return \"\";\n\n const activeFns = fns.filter((f) => selectedFunctions.has(f.slug));\n if (activeFns.length === 0) return \"\";\n\n const lines: string[] = [];\n lines.push(`## ${integrationName} (${integrationSlug})`);\n\n for (const f of activeFns) {\n const instruction = functionInstructions[f.slug] || f.defaultInstructions;\n lines.push(`### ${f.slug}`);\n lines.push(instruction);\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationsTabProps {\n config: GagentsHookConfig;\n agentId: number;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n// Local state types\ninterface IntegrationLocalState {\n enabled: boolean;\n selectedFunctions: Set<string>;\n functionInstructions: Record<string, string>;\n}\n\nexport function IntegrationsTab({\n config,\n agentId,\n}: IntegrationsTabProps) {\n const { cards, isLoading } = useIntegrationState(config, agentId);\n const { data: agentToolsData, isLoading: agentToolsLoading } = useAgentTools(config, agentId);\n const { data: toolsData } = useTools(config);\n const addAgentTool = useAddAgentTool(config);\n const removeAgentTool = useRemoveAgentTool(config);\n const updateAgentTool = useUpdateAgentTool(config);\n const createTool = useCreateTool(config);\n\n const agentTools = agentToolsData?.data ?? [];\n const allTools = toolsData?.data ?? [];\n\n // Local state: integrationSlug -> state\n const [localState, setLocalState] = useState<Record<string, IntegrationLocalState>>({});\n const [serverState, setServerState] = useState<Record<string, IntegrationLocalState>>({});\n const [initialized, setInitialized] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [editingFunction, setEditingFunction] = useState<string | null>(null);\n const [expandedCards, setExpandedCards] = useState<Set<string>>(new Set());\n\n // Only show connected credentials (account-level)\n const connectedCards = cards.filter(\n (c) => !c.isAddNew && (c.state === \"connected\" || c.state === \"expired\"),\n );\n\n // Initialize state from server data\n useEffect(() => {\n if (!connectedCards.length || initialized) return;\n\n const state: Record<string, IntegrationLocalState> = {};\n for (const card of connectedCards) {\n const slug = card.definition.slug;\n const isLinked = card.linkedToAgent;\n const fns = INTEGRATION_FUNCTIONS[slug] ?? [];\n\n if (isLinked) {\n // Parse existing custom_instructions to restore function selections\n const toolId = card.tool?.id;\n const agentTool = toolId ? agentTools.find((at) => at.id_tool === toolId) : null;\n const existingInstructions = agentTool?.custom_instructions || \"\";\n\n const selectedFns = new Set<string>();\n const fnInstr: Record<string, string> = {};\n for (const fn of fns) {\n if (!existingInstructions || existingInstructions.includes(fn.slug)) {\n selectedFns.add(fn.slug);\n }\n // Extract instruction from custom_instructions if present\n const match = existingInstructions.match(new RegExp(`- ${fn.slug}: (.+)`));\n fnInstr[fn.slug] = match?.[1] ?? fn.defaultInstructions;\n }\n\n state[slug] = { enabled: true, selectedFunctions: selectedFns, functionInstructions: fnInstr };\n } else {\n state[slug] = {\n enabled: false,\n selectedFunctions: new Set(fns.map((f) => f.slug)),\n functionInstructions: Object.fromEntries(fns.map((f) => [f.slug, f.defaultInstructions])),\n };\n }\n }\n\n setLocalState(state);\n setServerState(JSON.parse(JSON.stringify(state, (_k, v) => v instanceof Set ? [...v] : v)));\n setInitialized(true);\n }, [connectedCards, agentTools, initialized]);\n\n // Detect changes\n const hasChanges = useMemo(() => {\n if (!initialized) return false;\n const localKeys = Object.keys(localState);\n for (const slug of localKeys) {\n const local = localState[slug];\n const server = serverState[slug];\n if (!server) return true;\n if (local.enabled !== server.enabled) return true;\n const serverFns = server.selectedFunctions instanceof Set ? server.selectedFunctions : new Set(server.selectedFunctions as unknown as string[]);\n if (local.selectedFunctions.size !== serverFns.size) return true;\n for (const fn of local.selectedFunctions) {\n if (!serverFns.has(fn)) return true;\n }\n // Check instructions for selected functions\n for (const fn of local.selectedFunctions) {\n if ((local.functionInstructions[fn] ?? '') !== (server.functionInstructions[fn] ?? '')) return true;\n }\n }\n return false;\n }, [localState, serverState, initialized]);\n\n // Toggle integration on/off (local only)\n const handleToggle = useCallback(\n (card: IntegrationCardData, checked: boolean) => {\n const slug = card.definition.slug;\n setLocalState((prev) => ({\n ...prev,\n [slug]: {\n ...prev[slug],\n enabled: checked,\n },\n }));\n if (checked) {\n setExpandedCards((prev) => new Set([...prev, slug]));\n }\n },\n [],\n );\n\n // Toggle function checkbox (local only)\n const handleToggleFunction = useCallback(\n (slug: string, fnSlug: string, checked: boolean) => {\n setLocalState((prev) => {\n const current = prev[slug];\n if (!current) return prev;\n const fns = new Set(current.selectedFunctions);\n if (checked) fns.add(fnSlug); else fns.delete(fnSlug);\n return { ...prev, [slug]: { ...current, selectedFunctions: fns } };\n });\n },\n [],\n );\n\n // Update function instruction (local only)\n const handleUpdateInstruction = useCallback(\n (slug: string, fnSlug: string, instruction: string) => {\n setLocalState((prev) => {\n const current = prev[slug];\n if (!current) return prev;\n return {\n ...prev,\n [slug]: {\n ...current,\n functionInstructions: { ...current.functionInstructions, [fnSlug]: instruction },\n },\n };\n });\n },\n [],\n );\n\n // Save all changes\n const saveNow = useCallback(async () => {\n setIsSaving(true);\n try {\n for (const slug of Object.keys(localState)) {\n const local = localState[slug];\n const card = connectedCards.find((c) => c.definition.slug === slug);\n if (!card) continue;\n\n const serverEntry = serverState[slug];\n const wasEnabled = serverEntry?.enabled ?? false;\n\n if (local.enabled && !wasEnabled) {\n // Activate: create tool if needed, then add agent_tool\n let toolId = card.tool?.id;\n if (!toolId) {\n const existingTool = allTools.find((t) => t.slug === slug);\n if (existingTool) {\n toolId = existingTool.id;\n } else {\n const result = await createTool.mutateAsync({\n name: card.definition.name, slug, type: \"integration\", description: card.definition.description,\n });\n const d = result?.data;\n toolId = (Array.isArray(d) ? d[0]?.id : (d as Tool | undefined)?.id) ?? undefined;\n if (!toolId) continue;\n }\n }\n const customInstructions = buildCustomInstructions(slug, card.definition.name, local.selectedFunctions, local.functionInstructions);\n await addAgentTool.mutateAsync({\n idAgent: agentId,\n body: { id_tool: toolId, enabled: true, ...(customInstructions ? { custom_instructions: customInstructions } : {}) },\n });\n } else if (!local.enabled && wasEnabled) {\n // Deactivate: remove agent_tool\n const toolId = card.tool?.id;\n if (toolId) {\n const agentTool = agentTools.find((at) => at.id_tool === toolId);\n if (agentTool) {\n await removeAgentTool.mutateAsync({ idAgent: agentId, id: agentTool.id });\n }\n }\n } else if (local.enabled && wasEnabled) {\n // Update: functions or instructions changed\n const toolId = card.tool?.id;\n if (toolId) {\n const agentTool = agentTools.find((at) => at.id_tool === toolId);\n if (agentTool) {\n const customInstructions = buildCustomInstructions(slug, card.definition.name, local.selectedFunctions, local.functionInstructions);\n await updateAgentTool.mutateAsync({\n idAgent: agentId, id: agentTool.id,\n body: { custom_instructions: customInstructions },\n });\n }\n }\n }\n }\n // Sync server state\n setServerState(JSON.parse(JSON.stringify(localState, (_k, v) => v instanceof Set ? [...v] : v)));\n toast.success(\"Integrações salvas\");\n } catch {\n toast.error(\"Erro ao salvar integrações\");\n } finally {\n setIsSaving(false);\n }\n }, [localState, serverState, connectedCards, allTools, agentTools, agentId, addAgentTool, removeAgentTool, updateAgentTool, createTool]);\n\n const discard = useCallback(() => {\n const restored: Record<string, IntegrationLocalState> = {};\n for (const [slug, entry] of Object.entries(serverState)) {\n restored[slug] = {\n ...entry,\n selectedFunctions: entry.selectedFunctions instanceof Set ? entry.selectedFunctions : new Set(entry.selectedFunctions as unknown as string[]),\n };\n }\n setLocalState(restored);\n }, [serverState]);\n\n // Loading state\n if (isLoading || agentToolsLoading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n // Empty state — no integrations connected at account level\n if (connectedCards.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 py-16 text-muted-foreground\">\n <Plug className=\"h-10 w-10\" />\n <p className=\"text-sm font-medium\">Nenhuma integração conectada</p>\n <p className=\"text-xs text-center max-w-sm\">\n Conecte integrações na página de Integrações da conta para que possam\n ser ativadas neste agente.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <p className=\"text-xs text-muted-foreground\">\n Ative ou desative as integrações conectadas na conta para este agente.\n </p>\n\n <div className=\"grid grid-cols-1 gap-3\">\n {connectedCards.map((card) => {\n const Icon = resolveIcon(card.definition.icon);\n const integrationSlug = card.definition.slug;\n const local = localState[integrationSlug];\n const isLinked = local?.enabled ?? false;\n const fns = INTEGRATION_FUNCTIONS[integrationSlug];\n const isExpanded = expandedCards.has(integrationSlug);\n const selected = local?.selectedFunctions ?? new Set();\n const instructions = local?.functionInstructions ?? {};\n\n return (\n <div\n key={`${integrationSlug}-cred-${card.credentialId}`}\n className={cn(\n \"rounded-xl border bg-card transition-shadow\",\n isLinked ? \"border-primary/30 shadow-sm\" : \"opacity-75\",\n )}\n >\n {/* Header */}\n <div className=\"flex items-center gap-3 p-4\">\n {/* Icon */}\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"h-4.5 w-4.5\" />\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"text-sm font-medium leading-tight truncate\">\n {card.definition.name}\n </h4>\n {card.accountLabel && (\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"text-xs text-muted-foreground truncate\" title={card.accountLabel}>\n {card.accountLabel}\n </p>\n </TooltipTrigger>\n <TooltipContent>{card.accountLabel}</TooltipContent>\n </Tooltip>\n )}\n {card.state === \"expired\" && (\n <p className=\"text-xs text-amber-600 dark:text-amber-400\">Expirado</p>\n )}\n </div>\n\n {/* Expand toggle (only when linked and has functions) */}\n {isLinked && fns && (\n <button\n type=\"button\"\n className=\"p-1 rounded hover:bg-muted/50 transition-colors\"\n onClick={() =>\n setExpandedCards((prev) => {\n const next = new Set(prev);\n if (next.has(integrationSlug)) {\n next.delete(integrationSlug);\n } else {\n next.add(integrationSlug);\n }\n return next;\n })\n }\n aria-label=\"Expandir funções\"\n >\n <ChevronDown\n className={cn(\n \"h-4 w-4 text-muted-foreground transition-transform\",\n isExpanded ? \"rotate-0\" : \"-rotate-90\",\n )}\n />\n </button>\n )}\n\n {/* Toggle */}\n <Switch\n checked={isLinked}\n disabled={isSaving}\n onCheckedChange={(checked) => handleToggle(card, checked)}\n aria-label={`${isLinked ? \"Desativar\" : \"Ativar\"} ${card.definition.name} para este agente`}\n />\n </div>\n\n {/* Expandable function list */}\n {isLinked && fns && isExpanded && (\n <div className=\"border-t px-4 py-3 space-y-2\">\n <p className=\"text-xs text-muted-foreground mb-2\">\n Selecione as funções disponíveis para o agente:\n </p>\n {fns.map((fn) => {\n const isSelected = selected.has(fn.slug);\n const isEditing = editingFunction === `${integrationSlug}:${fn.slug}`;\n const currentInstruction = instructions[fn.slug] ?? fn.defaultInstructions;\n\n return (\n <div key={fn.slug} className=\"space-y-1\">\n <div className=\"flex items-center gap-2\">\n <Checkbox\n checked={isSelected}\n onCheckedChange={(val) =>\n handleToggleFunction(integrationSlug, fn.slug, val === true)\n }\n aria-label={fn.label}\n />\n <div className=\"flex-1 min-w-0\">\n <span className={cn(\"text-sm\", isSelected ? \"\" : \"text-muted-foreground\")}>\n {fn.label}\n </span>\n <span className=\"text-xs text-muted-foreground ml-1.5\">\n ({fn.slug})\n </span>\n </div>\n <button\n type=\"button\"\n className=\"p-1 rounded hover:bg-muted/50 transition-colors\"\n onClick={() =>\n setEditingFunction(\n isEditing ? null : `${integrationSlug}:${fn.slug}`,\n )\n }\n aria-label={`Editar instruções de ${fn.label}`}\n >\n <Pencil className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n </div>\n\n {/* Inline instruction editor */}\n {isEditing && (\n <div className=\"ml-6\">\n <textarea\n className=\"w-full rounded-md border bg-background px-3 py-2 text-sm resize-y min-h-[60px] focus:outline-none focus:ring-1 focus:ring-ring\"\n value={currentInstruction}\n onChange={(e) =>\n handleUpdateInstruction(integrationSlug, fn.slug, e.target.value)\n }\n placeholder=\"Instruções personalizadas para esta função...\"\n rows={2}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Save bar */}\n {hasChanges && (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-2 rounded-lg border bg-background p-3 shadow-sm\">\n <p className=\"text-sm text-muted-foreground\">Você tem alterações não salvas.</p>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={discard} disabled={isSaving}>\n Descartar\n </Button>\n <Button size=\"sm\" onClick={saveNow} disabled={isSaving}>\n {isSaving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Salvar\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { AgentObjectivesList } from \"./agent-objectives-list\";\nimport { AgentDefinitionEditor } from \"./agent-definition-editor\";\nimport { AgentRevisionTab } from \"./agent-revision-tab\";\nimport { AgentConversationsPanel } from \"../conversations/agent-conversations-panel\";\nimport { CapabilitiesTab } from \"../capabilities/capabilities-tab\";\nimport { IntegrationsTab } from \"../capabilities/integrations-tab\";\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Target, Settings2, MessageCircle, Blocks, Plug, History } from \"lucide-react\";\n\ninterface AgentTabsProps {\n agent: Agent;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nexport function AgentTabs({\n agent,\n config,\n renderChatLink,\n}: AgentTabsProps) {\n return (\n <Tabs defaultValue=\"definicao\">\n <TabsList>\n <TabsTrigger value=\"definicao\" className=\"flex items-center gap-1.5\">\n <Settings2 aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Definição\n </TabsTrigger>\n <TabsTrigger value=\"objetivos\" className=\"flex items-center gap-1.5\">\n <Target aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Objetivos\n </TabsTrigger>\n <TabsTrigger value=\"capacidades\" className=\"flex items-center gap-1.5\">\n <Blocks aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Capacidades\n </TabsTrigger>\n <TabsTrigger value=\"integracoes\" className=\"flex items-center gap-1.5\">\n <Plug aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Integrações\n </TabsTrigger>\n <TabsTrigger value=\"conversas\" className=\"flex items-center gap-1.5\">\n <MessageCircle aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Conversas\n </TabsTrigger>\n <TabsTrigger value=\"revisao\" className=\"flex items-center gap-1.5\">\n <History aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Revisão\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"definicao\" className=\"mt-4\">\n <AgentDefinitionEditor agent={agent} config={config} />\n </TabsContent>\n\n <TabsContent value=\"objetivos\" className=\"mt-4\">\n <AgentObjectivesList agent={agent} config={config} />\n </TabsContent>\n\n <TabsContent value=\"capacidades\" className=\"mt-4\">\n <CapabilitiesTab config={config} agentId={agent.id} />\n </TabsContent>\n\n <TabsContent value=\"integracoes\" className=\"mt-4\">\n <IntegrationsTab config={config} agentId={agent.id} />\n </TabsContent>\n\n <TabsContent value=\"conversas\" className=\"mt-4\">\n <AgentConversationsPanel\n agent={agent}\n config={config}\n renderChatLink={renderChatLink}\n />\n </TabsContent>\n\n <TabsContent value=\"revisao\" className=\"mt-4\">\n <AgentRevisionTab agent={agent} config={config} />\n </TabsContent>\n </Tabs>\n );\n}\n","import { useState } from \"react\";\nimport type { Agent, AgentTool, Tool, ToolCredential } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n useAgentTools,\n useAddAgentTool,\n useRemoveAgentTool,\n useUpdateAgentTool,\n} from \"../../hooks\";\nimport { useTools } from \"../../hooks\";\nimport { useToolCredentials } from \"../../hooks\";\nimport {\n Switch,\n Badge,\n Button,\n Skeleton,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Input,\n Textarea,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n Trash2,\n Plus,\n Wrench,\n Settings2,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ninterface AgentToolsListProps {\n agent: Agent;\n config: GagentsHookConfig;\n}\n\nexport function AgentToolsList({ agent, config }: AgentToolsListProps) {\n const { data: agentToolsData, isLoading } = useAgentTools(config, agent.id);\n const { data: allToolsData } = useTools(config);\n const addMutation = useAddAgentTool(config);\n const removeMutation = useRemoveAgentTool(config);\n const updateMutation = useUpdateAgentTool(config);\n\n const [removeTarget, setRemoveTarget] = useState<AgentTool | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [configTarget, setConfigTarget] = useState<AgentTool | null>(null);\n const [configInstructions, setConfigInstructions] = useState(\"\");\n const [configCredentialId, setConfigCredentialId] = useState<string>(\"\");\n\n const { data: credentialsData } = useToolCredentials(config);\n const allCredentials: ToolCredential[] = credentialsData?.data || [];\n\n const agentTools = agentToolsData?.data || [];\n const allTools = (allToolsData?.data || []).filter((t: Tool) => !t.slug?.startsWith(\"gclinic_\"));\n const assignedToolIds = new Set(agentTools.map((at) => at.id_tool));\n // Filter out internal gclinic_* tools from assigned tools display\n const visibleAgentTools = agentTools.filter((at) => {\n const tool = allTools.find((t: Tool) => t.id === at.id_tool);\n return !tool || !tool.slug?.startsWith(\"gclinic_\");\n });\n const availableTools = allTools.filter((t: Tool) => !assignedToolIds.has(t.id));\n const filteredAvailable = availableTools.filter((t: Tool) =>\n t.name.toLowerCase().includes(search.toLowerCase()),\n );\n\n function getToolInfo(idTool: number): Tool | undefined {\n return allTools.find((t) => t.id === idTool);\n }\n\n async function handleToggleEnabled(agentTool: AgentTool, checked: boolean) {\n try {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: agentTool.id,\n body: { enabled: checked },\n });\n toast.success(checked ? \"Ferramenta ativada\" : \"Ferramenta desativada\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao alterar estado da ferramenta\",\n );\n }\n }\n\n async function handleAdd(tool: Tool) {\n try {\n await addMutation.mutateAsync({\n idAgent: agent.id,\n body: { id_tool: tool.id },\n });\n toast.success(\"Ferramenta adicionada\");\n setAddOpen(false);\n setSearch(\"\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao adicionar ferramenta\",\n );\n }\n }\n\n async function handleRemove() {\n if (!removeTarget) return;\n try {\n await removeMutation.mutateAsync({\n idAgent: agent.id,\n id: removeTarget.id,\n });\n toast.success(\"Ferramenta removida\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao remover ferramenta\",\n );\n } finally {\n setRemoveTarget(null);\n }\n }\n\n function openConfig(agentTool: AgentTool) {\n setConfigTarget(agentTool);\n setConfigInstructions(agentTool.custom_instructions || \"\");\n setConfigCredentialId(agentTool.id_tool_credential ? String(agentTool.id_tool_credential) : \"\");\n }\n\n async function handleSaveConfig() {\n if (!configTarget) return;\n try {\n const newCredentialId = configCredentialId ? parseInt(configCredentialId, 10) : null;\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: configTarget.id,\n body: {\n custom_instructions: configInstructions.trim() || null,\n id_tool_credential: newCredentialId,\n },\n });\n toast.success(\"Configuração atualizada\");\n setConfigTarget(null);\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao atualizar configuração\",\n );\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3 p-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-14 w-full\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n {visibleAgentTools.length} ferramenta{visibleAgentTools.length !== 1 ? \"s\" : \"\"} associada{visibleAgentTools.length !== 1 ? \"s\" : \"\"}\n </h3>\n <Popover open={addOpen} onOpenChange={setAddOpen}>\n <PopoverTrigger asChild>\n <Button size=\"sm\" disabled={availableTools.length === 0}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Adicionar Ferramenta\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-72 p-0\" align=\"end\">\n <div className=\"p-2\">\n <Input\n placeholder=\"Buscar ferramenta\\u2026\"\n aria-label=\"Buscar ferramenta\"\n name=\"search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"h-8\"\n />\n </div>\n <div className=\"max-h-48 overflow-y-auto\">\n {filteredAvailable.length === 0 ? (\n <p className=\"p-3 text-center text-sm text-muted-foreground\">\n Nenhuma ferramenta disponível\n </p>\n ) : (\n filteredAvailable.map((tool) => (\n <button\n key={tool.id}\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-sm hover:bg-accent\"\n onClick={() => handleAdd(tool)}\n disabled={addMutation.isPending}\n >\n <Wrench className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"flex-1 font-medium\">{tool.name}</span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {tool.type}\n </Badge>\n </button>\n ))\n )}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n\n {visibleAgentTools.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <Wrench className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma ferramenta associada. Clique em 'Adicionar Ferramenta' para começar.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {visibleAgentTools.map((agentTool) => {\n const tool = getToolInfo(agentTool.id_tool);\n return (\n <div\n key={agentTool.id}\n className=\"flex items-center gap-3 rounded-lg border bg-card p-3\"\n >\n <div className=\"flex flex-1 flex-col gap-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate font-medium\">\n {tool?.name || `Ferramenta #${agentTool.id_tool}`}\n </span>\n {tool?.type && (\n <Badge variant=\"secondary\" className=\"shrink-0 text-xs\">\n {tool.type}\n </Badge>\n )}\n </div>\n {agentTool.custom_instructions && (\n <p className=\"truncate text-xs text-muted-foreground\">\n {agentTool.custom_instructions}\n </p>\n )}\n </div>\n\n <Switch\n aria-label=\"Ativar/Desativar\"\n checked={agentTool.enabled}\n onCheckedChange={(checked) =>\n handleToggleEnabled(agentTool, checked)\n }\n disabled={updateMutation.isPending}\n />\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Configurar\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => openConfig(agentTool)}\n title=\"Configurar instruções\"\n >\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Remover\"\n className=\"shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={() => setRemoveTarget(agentTool)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Config dialog for custom_instructions */}\n <Dialog\n open={!!configTarget}\n onOpenChange={(open) => !open && setConfigTarget(null)}\n >\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>\n Instruções da Ferramenta\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n {configTarget && getToolInfo(configTarget.id_tool)?.type !== \"none\" && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-credential\">Credencial</Label>\n <Select\n value={configCredentialId || undefined}\n onValueChange={(val) => setConfigCredentialId(val === \"__none__\" ? \"\" : val)}\n >\n <SelectTrigger id=\"tool-credential\">\n <SelectValue placeholder=\"Selecione uma credencial (opcional)\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none__\">Nenhuma (automático)</SelectItem>\n {allCredentials\n .filter((c) => configTarget && c.id_tool === configTarget.id_tool && c.status === \"active\")\n .map((c) => (\n <SelectItem key={c.id} value={String(c.id)}>\n {c.label || `Credencial #${c.id}`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-muted-foreground\">\n Vincule uma credencial específica a esta ferramenta neste agente.\n </p>\n </div>\n )}\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-instructions\">Instruções Personalizadas</Label>\n <Textarea\n id=\"tool-instructions\"\n name=\"instructions\"\n value={configInstructions}\n onChange={(e) => setConfigInstructions(e.target.value)}\n placeholder=\"Instru\\u00e7\\u00f5es sobre como e quando o agente deve usar esta ferramenta\\u2026\"\n rows={6}\n />\n <p className=\"text-xs text-muted-foreground\">\n Este texto é adicionado ao prompt do agente para orientar o uso da ferramenta.\n </p>\n </div>\n </div>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setConfigTarget(null)}\n >\n Cancelar\n </Button>\n <Button\n onClick={handleSaveConfig}\n disabled={updateMutation.isPending}\n >\n Salvar\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Remove confirmation */}\n <AlertDialog\n open={!!removeTarget}\n onOpenChange={(open) => !open && setRemoveTarget(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remover ferramenta?</AlertDialogTitle>\n <AlertDialogDescription>\n A ferramenta será desassociada deste agente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleRemove}\n disabled={removeMutation.isPending}\n >\n Remover\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { useTools, useDeleteTool } from \"../../hooks\";\nimport type { Tool } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { DataTable } from \"@greatapps/greatauth-ui\";\nimport {\n Input,\n Badge,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Pencil, Trash2, Search } from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\ninterface ToolsTableProps {\n onEdit: (tool: Tool) => void;\n config: GagentsHookConfig;\n}\n\nfunction useColumns(\n onEdit: (tool: Tool) => void,\n onDelete: (id: number) => void,\n): ColumnDef<Tool>[] {\n return [\n {\n accessorKey: \"name\",\n header: \"Nome\",\n cell: ({ row }) => (\n <span className=\"font-medium\">{row.original.name}</span>\n ),\n sortingFn: (rowA, rowB) =>\n rowA.original.name\n .toLowerCase()\n .localeCompare(rowB.original.name.toLowerCase()),\n },\n {\n accessorKey: \"slug\",\n header: \"Slug\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm font-mono\">\n {row.original.slug || \"\\u2014\"}\n </span>\n ),\n },\n {\n accessorKey: \"type\",\n header: \"Tipo\",\n cell: ({ row }) => (\n <Badge variant=\"secondary\">{row.original.type}</Badge>\n ),\n },\n {\n accessorKey: \"description\",\n header: \"Descrição\",\n cell: ({ row }) => {\n const desc = row.original.description;\n if (!desc) return <span className=\"text-muted-foreground text-sm\">{\"\\u2014\"}</span>;\n return (\n <span className=\"text-muted-foreground text-sm\">\n {desc.length > 50 ? `${desc.slice(0, 50)}\\u2026` : desc}\n </span>\n );\n },\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {format(new Date(row.original.datetime_add), \"dd/MM/yyyy\", {\n locale: ptBR,\n })}\n </span>\n ),\n },\n {\n id: \"actions\",\n size: 80,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label=\"Editar\"\n onClick={() => onEdit(row.original)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Editar</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n aria-label=\"Excluir\"\n onClick={() => onDelete(row.original.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Excluir</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport function ToolsTable({ onEdit, config }: ToolsTableProps) {\n const [search, setSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n\n const queryParams = useMemo(() => {\n const params: Record<string, string> = {\n limit: \"15\",\n page: String(page),\n };\n if (search) {\n params.search = search;\n }\n return params;\n }, [search, page]);\n\n const { data, isLoading } = useTools(config, queryParams);\n const deleteTool = useDeleteTool(config);\n const [deleteId, setDeleteId] = useState<number | null>(null);\n\n const rawTools = data?.data || [];\n const tools = rawTools.filter((t: Tool) => !t.slug?.startsWith(\"gclinic_\"));\n const total = tools.length;\n\n const columns = useColumns(\n (tool) => onEdit(tool),\n (id) => setDeleteId(id),\n );\n\n function handleDelete() {\n if (!deleteId) return;\n deleteTool.mutate(deleteId, {\n onSuccess: () => {\n toast.success(\"Ferramenta excluída\");\n setDeleteId(null);\n },\n onError: () => toast.error(\"Erro ao excluir ferramenta\"),\n });\n }\n\n function handleSearchChange(value: string) {\n setSearch(value);\n setPage(1);\n }\n\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search aria-hidden=\"true\" className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar ferramentas\\u2026\"\n aria-label=\"Buscar ferramentas\"\n name=\"search\"\n autoComplete=\"off\"\n value={search}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={tools}\n isLoading={isLoading}\n emptyMessage=\"Nenhuma ferramenta encontrada\"\n total={total}\n page={page}\n onPageChange={setPage}\n pageSize={15}\n />\n\n {/* Delete confirmation */}\n <AlertDialog\n open={!!deleteId}\n onOpenChange={(open) => !open && setDeleteId(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir ferramenta?</AlertDialogTitle>\n <AlertDialogDescription>\n Esta ação não pode ser desfeita. A ferramenta será removida\n permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel variant=\"outline\" size=\"default\">\n Cancelar\n </AlertDialogCancel>\n <AlertDialogAction\n variant=\"default\"\n size=\"default\"\n onClick={handleDelete}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","import { useState } from \"react\";\nimport { useCreateTool, useUpdateTool } from \"../../hooks\";\nimport type { Tool } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n Input,\n Textarea,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nconst TOOL_AUTH_TYPES = [\n { value: \"none\", label: \"Nenhuma\" },\n { value: \"api_key\", label: \"API Key\" },\n { value: \"oauth2\", label: \"OAuth 2.0\" },\n] as const;\n\ninterface ToolFormDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n tool?: Tool;\n config: GagentsHookConfig;\n}\n\ninterface FormState {\n name: string;\n slug: string;\n type: string;\n description: string;\n functionDefinitions: string;\n nameError: boolean;\n slugError: boolean;\n typeError: boolean;\n jsonError: boolean;\n}\n\nfunction toolToFormState(tool?: Tool): FormState {\n return {\n name: tool?.name || \"\",\n slug: tool?.slug || \"\",\n type: tool?.type || \"none\",\n description: tool?.description || \"\",\n functionDefinitions: tool?.function_definitions\n ? formatJson(tool.function_definitions)\n : \"\",\n nameError: false,\n slugError: false,\n typeError: false,\n jsonError: false,\n };\n}\n\nfunction formatJson(str: string): string {\n try {\n return JSON.stringify(JSON.parse(str), null, 2);\n } catch {\n return str;\n }\n}\n\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction isValidJson(str: string): boolean {\n if (!str.trim()) return true;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function ToolFormDialog({\n open,\n onOpenChange,\n tool,\n config,\n}: ToolFormDialogProps) {\n const isEditing = !!tool;\n const createTool = useCreateTool(config);\n const updateTool = useUpdateTool(config);\n const [form, setForm] = useState<FormState>(() => toolToFormState(tool));\n const [slugManuallyEdited, setSlugManuallyEdited] = useState(false);\n\n // Reset form when dialog opens or tool changes\n const [lastResetKey, setLastResetKey] = useState(\n () => `${tool?.id}-${open}`,\n );\n const resetKey = `${tool?.id}-${open}`;\n if (resetKey !== lastResetKey) {\n setLastResetKey(resetKey);\n setForm(toolToFormState(open ? tool : undefined));\n setSlugManuallyEdited(false);\n }\n\n const isPending = createTool.isPending || updateTool.isPending;\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n\n let hasError = false;\n\n if (!form.name.trim()) {\n setForm((prev) => ({ ...prev, nameError: true }));\n hasError = true;\n }\n const effectiveSlug = form.slug.trim() || slugify(form.name);\n if (!effectiveSlug) {\n setForm((prev) => ({ ...prev, slugError: true }));\n hasError = true;\n }\n if (!form.type) {\n setForm((prev) => ({ ...prev, typeError: true }));\n hasError = true;\n }\n if (!isValidJson(form.functionDefinitions)) {\n setForm((prev) => ({ ...prev, jsonError: true }));\n hasError = true;\n }\n\n if (hasError) return;\n\n const body: Record<string, unknown> = {\n name: form.name.trim(),\n slug: effectiveSlug,\n type: form.type,\n };\n\n if (form.description.trim()) body.description = form.description.trim();\n else body.description = \"\";\n\n // JSONB critical rule: function_definitions must be sent as string\n if (form.functionDefinitions.trim()) {\n const parsed = JSON.parse(form.functionDefinitions.trim());\n body.function_definitions = JSON.stringify(parsed);\n } else {\n body.function_definitions = \"\";\n }\n\n try {\n if (isEditing) {\n await updateTool.mutateAsync({ id: tool.id, body });\n toast.success(\"Ferramenta atualizada\");\n } else {\n await createTool.mutateAsync(\n body as { name: string; slug: string; type: string; description?: string; function_definitions?: string },\n );\n toast.success(\"Ferramenta criada\");\n }\n onOpenChange(false);\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : isEditing ? \"Erro ao atualizar ferramenta\" : \"Erro ao criar ferramenta\",\n );\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>\n {isEditing ? \"Editar Ferramenta\" : \"Nova Ferramenta\"}\n </DialogTitle>\n </DialogHeader>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-name\">Nome *</Label>\n <Input\n id=\"tool-name\"\n name=\"name\"\n value={form.name}\n onChange={(e) => {\n const name = e.target.value;\n setForm((prev) => ({\n ...prev,\n name,\n nameError: name.trim() ? false : prev.nameError,\n ...(!slugManuallyEdited && !isEditing\n ? { slug: slugify(name), slugError: false }\n : {}),\n }));\n }}\n placeholder=\"Ex: Google Calendar\"\n disabled={isPending}\n />\n {form.nameError && (\n <p className=\"text-sm text-destructive\">Nome é obrigatório</p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-slug\">Slug (identificador único) *</Label>\n <Input\n id=\"tool-slug\"\n name=\"slug\"\n value={form.slug}\n onChange={(e) => {\n setSlugManuallyEdited(true);\n setForm((prev) => ({\n ...prev,\n slug: e.target.value,\n slugError: e.target.value.trim() ? false : prev.slugError,\n }));\n }}\n placeholder=\"Ex: google-calendar\"\n disabled={isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Gerado automaticamente a partir do nome. Usado internamente para identificar a ferramenta.\n </p>\n {form.slugError && (\n <p className=\"text-sm text-destructive\">Slug é obrigatório</p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-type\">Tipo de Autenticação *</Label>\n <Select\n value={form.type}\n onValueChange={(value) => {\n setForm((prev) => ({\n ...prev,\n type: value,\n typeError: false,\n }));\n }}\n disabled={isPending}\n >\n <SelectTrigger id=\"tool-type\">\n <SelectValue placeholder=\"Selecione o tipo\" />\n </SelectTrigger>\n <SelectContent>\n {TOOL_AUTH_TYPES.map((t) => (\n <SelectItem key={t.value} value={t.value}>\n {t.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-muted-foreground\">\n Define se a ferramenta requer credenciais para funcionar.\n </p>\n {form.typeError && (\n <p className=\"text-sm text-destructive\">Tipo é obrigatório</p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-description\">Descrição</Label>\n <Textarea\n id=\"tool-description\"\n name=\"description\"\n value={form.description}\n onChange={(e) =>\n setForm((prev) => ({ ...prev, description: e.target.value }))\n }\n placeholder=\"Descri\\u00e7\\u00e3o da ferramenta\\u2026\"\n rows={3}\n disabled={isPending}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-function-defs\">\n Definições de Função (JSON)\n </Label>\n <Textarea\n id=\"tool-function-defs\"\n name=\"functionDefs\"\n value={form.functionDefinitions}\n onChange={(e) => {\n setForm((prev) => ({\n ...prev,\n functionDefinitions: e.target.value,\n jsonError: false,\n }));\n }}\n placeholder={`[\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"nome_da_funcao\",\n \"description\": \"O que a fun\\u00e7\\u00e3o faz\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": { \\u2026 },\n \"required\": [\\u2026]\n }\n }\n }\n]`}\n rows={10}\n className=\"font-mono text-sm\"\n disabled={isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Array de definições no formato OpenAI Function Calling.\n </p>\n {form.jsonError && (\n <p className=\"text-sm text-destructive\">JSON inválido</p>\n )}\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={isPending}>\n {isPending ? (\n <Loader2 aria-hidden=\"true\" className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : null}\n {isEditing ? \"Salvar\" : \"Criar\"}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport type { Tool, ToolCredential } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n useDeleteToolCredential,\n} from \"../../hooks\";\nimport { useTools } from \"../../hooks\";\nimport { DataTable } from \"@greatapps/greatauth-ui\";\nimport {\n Input,\n Button,\n Badge,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Trash2, Search } from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\ninterface ToolCredentialsFormProps {\n credentials: ToolCredential[];\n isLoading: boolean;\n config: GagentsHookConfig;\n gagentsApiUrl: string;\n}\n\nfunction formatDate(dateStr: string | null): string {\n if (!dateStr) return \"Sem expiração\";\n return format(new Date(dateStr), \"dd/MM/yyyy\", { locale: ptBR });\n}\n\nfunction useColumns(\n tools: Tool[],\n onRemove: (cred: ToolCredential) => void,\n): ColumnDef<ToolCredential>[] {\n function getToolName(idTool: number | null): string {\n if (!idTool) return \"\\u2014\";\n const tool = tools.find((t) => t.id === idTool);\n return tool?.name || `Ferramenta #${idTool}`;\n }\n\n return [\n {\n accessorKey: \"label\",\n header: \"Label\",\n cell: ({ row }) => (\n <span className=\"font-medium\">{row.original.label || \"\\u2014\"}</span>\n ),\n },\n {\n accessorKey: \"id_tool\",\n header: \"Ferramenta\",\n cell: ({ row }) => (\n <span className=\"text-sm\">{getToolName(row.original.id_tool)}</span>\n ),\n },\n {\n accessorKey: \"status\",\n header: \"Status\",\n cell: ({ row }) => (\n <Badge\n variant={row.original.status === \"active\" ? \"default\" : \"destructive\"}\n >\n {row.original.status === \"active\" ? \"Ativo\" : \"Expirado\"}\n </Badge>\n ),\n },\n {\n accessorKey: \"expires_at\",\n header: \"Expira em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {formatDate(row.original.expires_at)}\n </span>\n ),\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {formatDate(row.original.datetime_add)}\n </span>\n ),\n },\n {\n id: \"actions\",\n header: \"Ações\",\n size: 100,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n aria-label=\"Excluir\"\n onClick={() => onRemove(row.original)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport function ToolCredentialsForm({\n credentials,\n isLoading,\n config,\n gagentsApiUrl,\n}: ToolCredentialsFormProps) {\n const deleteMutation = useDeleteToolCredential(config);\n const { data: toolsData } = useTools(config);\n const tools: Tool[] = (toolsData?.data || []).filter((t: Tool) => !t.slug?.startsWith(\"gclinic_\"));\n\n const [search, setSearch] = useState(\"\");\n const [removeTarget, setRemoveTarget] = useState<ToolCredential | null>(null);\n\n // Build a set of internal tool IDs to exclude from credentials display\n const internalToolIds = useMemo(() => {\n const allRawTools: Tool[] = toolsData?.data || [];\n return new Set(\n allRawTools\n .filter((t: Tool) => t.slug?.startsWith(\"gclinic_\"))\n .map((t: Tool) => t.id),\n );\n }, [toolsData]);\n\n const filteredCredentials = useMemo(() => {\n // Exclude credentials linked to internal gclinic_* tools\n const visible = credentials.filter(\n (cred) => !cred.id_tool || !internalToolIds.has(cred.id_tool),\n );\n if (!search) return visible;\n const term = search.toLowerCase();\n return visible.filter((cred) => {\n const toolName = tools.find((t) => t.id === cred.id_tool)?.name || \"\";\n return (\n (cred.label || \"\").toLowerCase().includes(term) ||\n toolName.toLowerCase().includes(term)\n );\n });\n }, [credentials, search, tools, internalToolIds]);\n\n const columns = useColumns(\n tools,\n (cred) => setRemoveTarget(cred),\n );\n\n async function handleRemove() {\n if (!removeTarget) return;\n try {\n const result = await deleteMutation.mutateAsync(removeTarget.id);\n if (result.status === 1) {\n toast.success(\"Credencial removida\");\n } else {\n toast.error(result.message || \"Erro ao remover credencial\");\n }\n } catch {\n toast.error(\"Erro ao remover credencial\");\n } finally {\n setRemoveTarget(null);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search aria-hidden=\"true\" className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar credenciais\\u2026\"\n aria-label=\"Buscar credenciais\"\n name=\"search\"\n autoComplete=\"off\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={filteredCredentials}\n isLoading={isLoading}\n emptyMessage=\"Nenhuma credencial encontrada\"\n />\n\n {/* Delete confirmation */}\n <AlertDialog\n open={!!removeTarget}\n onOpenChange={(open) => !open && setRemoveTarget(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remover credencial?</AlertDialogTitle>\n <AlertDialogDescription>\n A credencial será removida permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleRemove}\n disabled={deleteMutation.isPending}\n >\n Remover\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from \"react\";\nimport type { IntegrationCardData, IntegrationCardState } from \"../../hooks/use-integrations\";\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n CalendarSync,\n Plug,\n Settings,\n RefreshCw,\n Clock,\n Plus,\n MoreVertical,\n Unplug,\n Trash2,\n} from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { cn } from \"../../lib\";\n\n// ---------------------------------------------------------------------------\n// Icon mapping — extend as new integrations are added\n// ---------------------------------------------------------------------------\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n CalendarSync,\n Plug,\n Settings,\n RefreshCw,\n Clock,\n Plus,\n};\n\nfunction resolveIcon(name: string): LucideIcon {\n return ICON_MAP[name] ?? Plug;\n}\n\n// ---------------------------------------------------------------------------\n// Badge helpers\n// ---------------------------------------------------------------------------\n\ninterface BadgeVariant {\n label: string;\n className: string;\n}\n\nconst STATE_BADGES: Record<IntegrationCardState, BadgeVariant> = {\n available: {\n label: \"Disponível\",\n className: \"bg-muted text-muted-foreground\",\n },\n connected: {\n label: \"Conectado\",\n className: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400\",\n },\n expired: {\n label: \"Expirado\",\n className: \"bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400\",\n },\n coming_soon: {\n label: \"Em breve\",\n className: \"bg-muted text-muted-foreground\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationCardProps {\n card: IntegrationCardData;\n onConnect: (card: IntegrationCardData) => void;\n onReconnect?: (card: IntegrationCardData) => void;\n onDisconnect?: (card: IntegrationCardData) => void;\n onDelete?: (card: IntegrationCardData) => void;\n}\n\nexport function IntegrationCard({\n card,\n onConnect,\n onReconnect,\n onDisconnect,\n onDelete,\n}: IntegrationCardProps) {\n const { definition, state, isAddNew, accountLabel } = card;\n const Icon = resolveIcon(definition.icon);\n const isComingSoon = state === \"coming_soon\";\n const isConnected = state === \"connected\" || state === \"expired\";\n\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n\n // \"Add new\" card — clean outline style with single \"Conectar\" button\n if (isAddNew) {\n return (\n <div\n className={cn(\n \"group relative flex flex-col gap-3 rounded-xl border bg-card/50 p-5 transition-all\",\n \"hover:shadow-md hover:bg-card cursor-pointer\",\n )}\n role=\"button\"\n tabIndex={0}\n aria-label={`Conectar ${definition.name}`}\n onClick={() => onConnect(card)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onConnect(card);\n }\n }}\n >\n {/* Header row */}\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/5 text-primary/60\">\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"flex-1 min-w-0 space-y-0.5\">\n <h3 className=\"text-sm font-semibold leading-tight text-foreground\">\n {definition.name}\n </h3>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Conectar nova conta\n </p>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"mt-auto flex items-center justify-end pt-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onConnect(card);\n }}\n >\n Conectar\n </Button>\n </div>\n </div>\n );\n }\n\n // Coming soon card\n if (isComingSoon) {\n const badge = STATE_BADGES[state];\n return (\n <div\n className=\"group relative flex flex-col gap-3 rounded-xl border bg-card p-5 opacity-60 cursor-default\"\n aria-disabled\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"h-5 w-5\" />\n </div>\n <Badge variant=\"outline\" className={cn(\"text-xs\", badge.className)}>\n {badge.label}\n </Badge>\n </div>\n <div className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold leading-tight\">{definition.name}</h3>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {definition.description}\n </p>\n </div>\n </div>\n );\n }\n\n // Connected / expired card\n const badge = STATE_BADGES[state];\n\n return (\n <>\n <div\n className=\"group relative flex flex-col gap-3 rounded-xl border bg-card p-5 transition-shadow hover:shadow-md\"\n >\n {/* Header row */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-start gap-3 min-w-0 flex-1\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"flex-1 min-w-0 space-y-0.5\">\n <h3 className=\"text-sm font-semibold leading-tight\">{definition.name}</h3>\n {accountLabel && (\n <p className=\"text-xs text-muted-foreground leading-relaxed truncate\" title={accountLabel}>\n {accountLabel}\n </p>\n )}\n </div>\n </div>\n <Badge variant=\"outline\" className={cn(\"text-xs shrink-0\", badge.className)}>\n {badge.label}\n </Badge>\n </div>\n\n {/* Footer with \"Configurar\" dropdown */}\n <div className=\"mt-auto flex items-center justify-end gap-2 pt-1\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs gap-1.5\"\n >\n <Settings className=\"h-3.5 w-3.5\" />\n Configurar\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n onClick={() => onReconnect?.(card)}\n className=\"gap-2\"\n >\n <RefreshCw className=\"h-4 w-4\" />\n Reconectar\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => onDisconnect?.(card)}\n className=\"gap-2\"\n >\n <Unplug className=\"h-4 w-4\" />\n Desconectar\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => setDeleteDialogOpen(true)}\n className=\"gap-2 text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4\" />\n Remover\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n {/* Delete confirmation dialog */}\n <AlertDialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remover integração?</AlertDialogTitle>\n <AlertDialogDescription>\n Esta ação vai remover a credencial\n {accountLabel ? ` (${accountLabel})` : \"\"} de {definition.name}.\n Esta ação não pode ser desfeita.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => {\n onDelete?.(card);\n setDeleteDialogOpen(false);\n }}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Remover\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","'use client';\n\nimport { useState } from \"react\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { ToolsTable } from \"../tools/tools-table\";\nimport { ToolFormDialog } from \"../tools/tool-form-dialog\";\nimport type { Tool } from \"../../types\";\nimport { Info } from \"lucide-react\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface AdvancedTabProps {\n config: GagentsHookConfig;\n agentId: number;\n gagentsApiUrl: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AdvancedTab({ config, agentId, gagentsApiUrl }: AdvancedTabProps) {\n const [editingTool, setEditingTool] = useState<Tool | null>(null);\n const [showToolForm, setShowToolForm] = useState(false);\n\n function handleEditTool(tool: Tool) {\n setEditingTool(tool);\n setShowToolForm(true);\n }\n\n function handleToolFormOpenChange(open: boolean) {\n setShowToolForm(open);\n if (!open) setEditingTool(null);\n }\n\n return (\n <div className=\"space-y-8\">\n {/* Info banner */}\n <div className=\"flex items-start gap-3 rounded-lg border border-blue-200 bg-blue-50 p-4 dark:border-blue-900 dark:bg-blue-950/30\">\n <Info className=\"mt-0.5 h-4 w-4 shrink-0 text-blue-600 dark:text-blue-400\" />\n <p className=\"text-sm text-blue-800 dark:text-blue-300\">\n Use as abas <strong>Capacidades</strong> e <strong>Integrações</strong> para\n configuração simplificada. Esta aba oferece controlo manual avançado sobre\n ferramentas. As credenciais são geridas dentro de cada ferramenta.\n </p>\n </div>\n\n {/* Ferramentas section */}\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-medium\">Ferramentas</h3>\n <ToolsTable onEdit={handleEditTool} config={config} />\n </section>\n\n {/* Tool edit dialog */}\n <ToolFormDialog\n open={showToolForm}\n onOpenChange={handleToolFormOpenChange}\n tool={editingTool ?? undefined}\n config={config}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2, ChevronLeft, ChevronRight, Check } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport type { IntegrationDefinition } from \"../../data/integrations-registry\";\nimport type {\n WizardIntegrationMeta,\n OAuthResult,\n OAuthStatus,\n WizardStep,\n} from \"./types\";\nimport { InfoStep } from \"./wizard-steps/info-step\";\nimport { CredentialsStep } from \"./wizard-steps/credentials-step\";\nimport { ConfigStep, type ConfigOption } from \"./wizard-steps/config-step\";\nimport { ConfirmStep } from \"./wizard-steps/confirm-step\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst STEPS: WizardStep[] = [\"info\", \"credentials\", \"config\", \"confirm\"];\n\nconst STEP_LABELS: Record<WizardStep, string> = {\n info: \"Informação\",\n credentials: \"Credenciais\",\n config: \"Configuração\",\n confirm: \"Confirmação\",\n};\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationWizardProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Base integration definition from registry */\n integration: IntegrationDefinition;\n /** Wizard-specific metadata (capabilities, requirements, etc.) */\n meta: WizardIntegrationMeta;\n agentId: string | number;\n config: GagentsHookConfig;\n onComplete: () => void;\n /** gagents-r3-api base URL (used to build OAuth URLs) */\n gagentsApiUrl: string;\n /**\n * Existing credential ID -- when set, the wizard opens in edit mode\n * (step 2 shows \"Reconectar\" and step 3 is pre-filled).\n */\n existingCredentialId?: number;\n /**\n * Callback to load config options after OAuth completes.\n * e.g. load Google Calendar list. Returns ConfigOption[].\n */\n loadConfigOptions?: (credentialId: number) => Promise<ConfigOption[]>;\n /**\n * Existing config value to pre-fill the config step in edit/reconnect mode.\n */\n existingConfigValue?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function IntegrationWizard({\n open,\n onOpenChange,\n integration,\n meta,\n agentId: _agentId,\n config,\n onComplete,\n gagentsApiUrl,\n existingCredentialId,\n loadConfigOptions,\n existingConfigValue,\n}: IntegrationWizardProps) {\n const isReconnect = !!existingCredentialId;\n\n // Step navigation\n const [currentStep, setCurrentStep] = useState<WizardStep>(\"info\");\n const currentIndex = STEPS.indexOf(currentStep);\n\n // OAuth state\n const [oauthStatus, setOauthStatus] = useState<OAuthStatus>(\"idle\");\n const [oauthResult, setOauthResult] = useState<OAuthResult | null>(null);\n const popupRef = useRef<Window | null>(null);\n const popupPollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // API Key state\n const [apiKey, setApiKey] = useState(\"\");\n\n // Config state\n const [configOptions, setConfigOptions] = useState<ConfigOption[]>([]);\n const [configLoading, setConfigLoading] = useState(false);\n const [selectedConfigValue, setSelectedConfigValue] = useState(\"\");\n\n // Confirm state\n const [enableOnComplete, setEnableOnComplete] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Clean up popup poll interval on unmount\n useEffect(() => {\n return () => {\n if (popupPollRef.current) {\n clearInterval(popupPollRef.current);\n }\n };\n }, []);\n\n // Reset state when dialog opens/closes\n useEffect(() => {\n if (open) {\n setCurrentStep(\"info\");\n setOauthStatus(\"idle\");\n setOauthResult(null);\n setApiKey(\"\");\n setConfigOptions([]);\n setConfigLoading(false);\n setSelectedConfigValue(existingConfigValue ?? \"\");\n setEnableOnComplete(true);\n setIsSubmitting(false);\n } else {\n // Close any lingering popup\n if (popupRef.current && !popupRef.current.closed) {\n popupRef.current.close();\n }\n // Clear popup poll interval\n if (popupPollRef.current) {\n clearInterval(popupPollRef.current);\n popupPollRef.current = null;\n }\n }\n }, [open]);\n\n // -----------------------------------------------------------------------\n // OAuth popup message listener\n // -----------------------------------------------------------------------\n\n const handleOAuthMessage = useCallback(\n (event: MessageEvent) => {\n // Validate origin against gagents API URL\n try {\n if (event.origin !== new URL(gagentsApiUrl).origin) return;\n } catch {\n return;\n }\n\n // Only accept messages from our popup -- check for known data shape\n if (!event.data || typeof event.data !== \"object\") return;\n const msg = event.data as {\n type?: string;\n success?: boolean;\n email?: string;\n error?: string;\n credentialId?: number;\n };\n\n if (msg.type !== \"oauth-callback\") return;\n\n if (msg.success) {\n setOauthStatus(\"success\");\n setOauthResult({\n success: true,\n email: msg.email,\n credentialId: msg.credentialId,\n });\n\n // Auto-load config options if available\n const credId = msg.credentialId || existingCredentialId;\n if (credId && loadConfigOptions && meta.hasConfigStep) {\n setConfigLoading(true);\n loadConfigOptions(credId)\n .then((opts) => {\n setConfigOptions(opts);\n if (opts.length === 1) {\n setSelectedConfigValue(opts[0].id);\n }\n })\n .catch(() => setConfigOptions([]))\n .finally(() => setConfigLoading(false));\n }\n\n // Auto-advance to next step after a brief delay\n setTimeout(() => {\n setCurrentStep(meta.hasConfigStep ? \"config\" : \"confirm\");\n }, 1200);\n } else {\n setOauthStatus(\"error\");\n setOauthResult({\n success: false,\n error: msg.error || \"Falha na autorização\",\n });\n }\n },\n [gagentsApiUrl, existingCredentialId, meta.hasConfigStep, loadConfigOptions],\n );\n\n useEffect(() => {\n if (!open) return;\n window.addEventListener(\"message\", handleOAuthMessage);\n return () => window.removeEventListener(\"message\", handleOAuthMessage);\n }, [open, handleOAuthMessage]);\n\n // -----------------------------------------------------------------------\n // OAuth start\n // -----------------------------------------------------------------------\n\n async function startOAuth() {\n const { language = \"pt-br\", idWl = 1, accountId, token } = config;\n\n setOauthStatus(\"waiting\");\n\n try {\n // 1. Get auth URL from backend\n // If reconnecting an existing credential, pass credential_id so the\n // backend updates that specific credential instead of creating a new one.\n let authorizeUrl = `${gagentsApiUrl}/v1/${language}/${idWl}/accounts/${accountId}/oauth/authorize/${integration.slug}`;\n if (existingCredentialId) {\n authorizeUrl += `?credential_id=${existingCredentialId}`;\n }\n const response = await fetch(authorizeUrl, {\n headers: { Authorization: `Bearer ${token}` },\n });\n const result = await response.json();\n\n if (result.status !== 1 || !result.data?.auth_url) {\n setOauthStatus(\"error\");\n setOauthResult({\n success: false,\n error: result.message || \"Erro ao obter URL de autorização\",\n });\n return;\n }\n\n // 2. Open auth URL in popup\n const popup = window.open(\n result.data.auth_url,\n \"oauth-popup\",\n \"width=500,height=600,scrollbars=yes,resizable=yes\",\n );\n popupRef.current = popup;\n\n // Poll for popup closed without completing\n if (popup) {\n if (popupPollRef.current) {\n clearInterval(popupPollRef.current);\n }\n popupPollRef.current = setInterval(() => {\n if (popup.closed) {\n if (popupPollRef.current) {\n clearInterval(popupPollRef.current);\n popupPollRef.current = null;\n }\n setOauthStatus((prev) =>\n prev === \"waiting\" ? \"error\" : prev,\n );\n setOauthResult((prev) =>\n prev === null\n ? { success: false, error: \"Janela fechada antes de concluir\" }\n : prev,\n );\n }\n }, 500);\n }\n } catch (err) {\n setOauthStatus(\"error\");\n setOauthResult({\n success: false,\n error: \"Erro de rede ao obter URL de autorização\",\n });\n }\n }\n\n // -----------------------------------------------------------------------\n // Navigation\n // -----------------------------------------------------------------------\n\n function canAdvance(): boolean {\n switch (currentStep) {\n case \"info\":\n return true;\n case \"credentials\":\n if (integration.authType === \"oauth2\") {\n return oauthStatus === \"success\";\n }\n return apiKey.trim().length > 0;\n case \"config\":\n // Config step is optional -- can always advance\n return true;\n case \"confirm\":\n return true;\n default:\n return false;\n }\n }\n\n function goNext() {\n if (!canAdvance()) return;\n\n // Skip config step if not needed\n if (currentStep === \"credentials\" && !meta.hasConfigStep) {\n setCurrentStep(\"confirm\");\n return;\n }\n\n const nextIndex = currentIndex + 1;\n if (nextIndex < STEPS.length) {\n setCurrentStep(STEPS[nextIndex]);\n }\n }\n\n function goPrev() {\n // Skip config step backwards if not needed\n if (currentStep === \"confirm\" && !meta.hasConfigStep) {\n setCurrentStep(\"credentials\");\n return;\n }\n\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n setCurrentStep(STEPS[prevIndex]);\n }\n }\n\n // -----------------------------------------------------------------------\n // Complete\n // -----------------------------------------------------------------------\n\n async function handleComplete() {\n setIsSubmitting(true);\n try {\n // The actual credential creation happened during OAuth callback\n // or will happen via API key submission. Here we just finalize.\n //\n // For OAuth, the credential was already created by the backend callback.\n // The parent component handles any additional linking (agent_tool creation)\n // and query invalidation via the onComplete callback.\n //\n // Call onComplete BEFORE closing the dialog so query invalidation\n // triggers while the dialog is still mounted (avoids stale UI).\n\n onComplete();\n\n toast.success(\n `${integration.name} ${isReconnect ? \"reconectado\" : \"configurado\"} com sucesso!`,\n );\n } catch {\n toast.error(\"Erro ao finalizar configuração\");\n } finally {\n setIsSubmitting(false);\n }\n }\n\n // -----------------------------------------------------------------------\n // Render\n // -----------------------------------------------------------------------\n\n const selectedConfigOption =\n configOptions.find((o) => o.id === selectedConfigValue) || null;\n\n const isLastStep = currentStep === \"confirm\";\n\n // Effective steps (may skip config)\n const effectiveSteps = meta.hasConfigStep\n ? STEPS\n : STEPS.filter((s) => s !== \"config\");\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{integration.name}</DialogTitle>\n </DialogHeader>\n\n {/* Step indicator */}\n <StepIndicator steps={effectiveSteps} currentStep={currentStep} />\n\n {/* Step content */}\n <div className=\"min-h-[280px] py-2\">\n {currentStep === \"info\" && (\n <InfoStep\n integration={integration}\n meta={meta}\n />\n )}\n {currentStep === \"credentials\" && (\n <CredentialsStep\n integration={integration}\n meta={meta}\n oauthStatus={oauthStatus}\n oauthResult={oauthResult}\n apiKey={apiKey}\n onApiKeyChange={setApiKey}\n onStartOAuth={startOAuth}\n isReconnect={isReconnect}\n />\n )}\n {currentStep === \"config\" && (\n <ConfigStep\n integration={integration}\n options={configOptions}\n isLoading={configLoading}\n selectedValue={selectedConfigValue}\n onValueChange={setSelectedConfigValue}\n />\n )}\n {currentStep === \"confirm\" && (\n <ConfirmStep\n integration={integration}\n oauthResult={oauthResult}\n selectedConfigOption={selectedConfigOption}\n enableOnComplete={enableOnComplete}\n onEnableChange={setEnableOnComplete}\n />\n )}\n </div>\n\n {/* Footer */}\n <DialogFooter className=\"flex-row justify-between sm:justify-between\">\n <div>\n {currentStep === \"info\" ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n >\n Cancelar\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={goPrev}\n className=\"gap-1\"\n >\n <ChevronLeft aria-hidden=\"true\" className=\"h-4 w-4\" />\n Voltar\n </Button>\n )}\n </div>\n <div>\n {isLastStep ? (\n <Button\n type=\"button\"\n onClick={handleComplete}\n disabled={isSubmitting}\n className=\"gap-1\"\n >\n {isSubmitting ? (\n <Loader2\n aria-hidden=\"true\"\n className=\"h-4 w-4 animate-spin\"\n />\n ) : (\n <Check aria-hidden=\"true\" className=\"h-4 w-4\" />\n )}\n Concluir\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={goNext}\n disabled={!canAdvance()}\n className=\"gap-1\"\n >\n Continuar\n <ChevronRight aria-hidden=\"true\" className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step Indicator\n// ---------------------------------------------------------------------------\n\nfunction StepIndicator({\n steps,\n currentStep,\n}: {\n steps: WizardStep[];\n currentStep: WizardStep;\n}) {\n const currentIndex = steps.indexOf(currentStep);\n\n return (\n <div\n className=\"flex items-center justify-center gap-1 py-2\"\n role=\"list\"\n aria-label=\"Passos do assistente\"\n >\n {steps.map((step, i) => {\n const isCompleted = i < currentIndex;\n const isCurrent = step === currentStep;\n\n return (\n <div key={step} className=\"flex items-center\" role=\"listitem\">\n {/* Circle */}\n <div\n className={`\n flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium\n transition-colors duration-200\n ${\n isCurrent\n ? \"bg-primary text-primary-foreground\"\n : isCompleted\n ? \"bg-green-600 text-white\"\n : \"bg-muted text-muted-foreground\"\n }\n `}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={`${STEP_LABELS[step]}${isCompleted ? \" (concluído)\" : isCurrent ? \" (atual)\" : \"\"}`}\n >\n {isCompleted ? (\n <Check aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n i + 1\n )}\n </div>\n {/* Label */}\n <span\n className={`\n ml-1.5 hidden text-xs sm:inline\n ${isCurrent ? \"font-medium text-foreground\" : \"text-muted-foreground\"}\n `}\n >\n {STEP_LABELS[step]}\n </span>\n {/* Connector line */}\n {i < steps.length - 1 && (\n <div\n className={`\n mx-2 h-px w-6\n ${i < currentIndex ? \"bg-green-600\" : \"bg-border\"}\n `}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { Check, Info } from \"lucide-react\";\nimport type { IntegrationDefinition } from \"../../../data/integrations-registry\";\nimport type { WizardIntegrationMeta } from \"../types\";\n\ninterface InfoStepProps {\n integration: IntegrationDefinition;\n meta: WizardIntegrationMeta;\n}\n\nexport function InfoStep({ integration, meta }: InfoStepProps) {\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-start gap-4\">\n {meta.icon && (\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-muted\">\n {meta.icon}\n </div>\n )}\n <div className=\"space-y-1\">\n <h3 className=\"text-lg font-semibold\">{integration.name}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {integration.description}\n </p>\n </div>\n </div>\n\n {/* Capabilities */}\n {meta.capabilities.length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-medium\">O que esta integração permite:</h4>\n <ul className=\"space-y-2\">\n {meta.capabilities.map((cap, i) => (\n <li key={i} className=\"flex items-start gap-2 text-sm\">\n <Check\n aria-hidden=\"true\"\n className=\"mt-0.5 h-4 w-4 shrink-0 text-green-600\"\n />\n <div>\n <span className=\"font-medium\">{cap.label}</span>\n {cap.description && (\n <span className=\"text-muted-foreground\">\n {\" \"}\n — {cap.description}\n </span>\n )}\n </div>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Requirements */}\n {meta.requirements.length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-medium\">Requisitos:</h4>\n <ul className=\"space-y-2\">\n {meta.requirements.map((req, i) => (\n <li\n key={i}\n className=\"flex items-start gap-2 text-sm text-muted-foreground\"\n >\n <Info\n aria-hidden=\"true\"\n className=\"mt-0.5 h-4 w-4 shrink-0 text-blue-500\"\n />\n <span>{req}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { CheckCircle2, Loader2, AlertCircle, Shield } from \"lucide-react\";\nimport { Button, Input, Label } from \"@greatapps/greatauth-ui/ui\";\nimport type { IntegrationDefinition } from \"../../../data/integrations-registry\";\nimport type { WizardIntegrationMeta, OAuthStatus, OAuthResult } from \"../types\";\n\ninterface CredentialsStepProps {\n integration: IntegrationDefinition;\n meta: WizardIntegrationMeta;\n oauthStatus: OAuthStatus;\n oauthResult: OAuthResult | null;\n apiKey: string;\n onApiKeyChange: (value: string) => void;\n onStartOAuth: () => void;\n isReconnect?: boolean;\n}\n\nexport function CredentialsStep({\n integration,\n meta,\n oauthStatus,\n oauthResult,\n apiKey,\n onApiKeyChange,\n onStartOAuth,\n isReconnect = false,\n}: CredentialsStepProps) {\n if (integration.authType === \"oauth2\") {\n return (\n <OAuthCredentials\n integration={integration}\n meta={meta}\n oauthStatus={oauthStatus}\n oauthResult={oauthResult}\n onStartOAuth={onStartOAuth}\n isReconnect={isReconnect}\n />\n );\n }\n\n return <ApiKeyCredentials apiKey={apiKey} onApiKeyChange={onApiKeyChange} />;\n}\n\n// ---------------------------------------------------------------------------\n// OAuth flow UI\n// ---------------------------------------------------------------------------\n\nfunction OAuthCredentials({\n integration,\n meta,\n oauthStatus,\n oauthResult,\n onStartOAuth,\n isReconnect,\n}: {\n integration: IntegrationDefinition;\n meta: WizardIntegrationMeta;\n oauthStatus: OAuthStatus;\n oauthResult: OAuthResult | null;\n onStartOAuth: () => void;\n isReconnect: boolean;\n}) {\n const providerLabel = meta.providerLabel || integration.name;\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold\">Autenticação</h3>\n <p className=\"text-sm text-muted-foreground\">\n {isReconnect\n ? `Reconecte sua conta ${providerLabel} para renovar a autorização.`\n : `Conecte sua conta ${providerLabel} para permitir o acesso.`}\n </p>\n </div>\n\n {/* OAuth status area */}\n <div className=\"flex flex-col items-center gap-4 rounded-lg border p-6\">\n {oauthStatus === \"idle\" && (\n <Button\n onClick={onStartOAuth}\n size=\"lg\"\n className=\"gap-2\"\n >\n {meta.icon}\n {isReconnect\n ? `Reconectar com ${providerLabel}`\n : `Conectar com ${providerLabel}`}\n </Button>\n )}\n\n {oauthStatus === \"waiting\" && (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <Loader2\n aria-hidden=\"true\"\n className=\"h-8 w-8 animate-spin text-muted-foreground\"\n />\n <div>\n <p className=\"text-sm font-medium\">Aguardando autorização...</p>\n <p className=\"text-xs text-muted-foreground\">\n Complete o login na janela que foi aberta.\n </p>\n </div>\n </div>\n )}\n\n {oauthStatus === \"success\" && oauthResult && (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <CheckCircle2\n aria-hidden=\"true\"\n className=\"h-8 w-8 text-green-600\"\n />\n <div>\n <p className=\"text-sm font-medium text-green-700\">\n Conectado com sucesso!\n </p>\n {oauthResult.email && (\n <p className=\"text-xs text-muted-foreground\">\n {oauthResult.email}\n </p>\n )}\n </div>\n </div>\n )}\n\n {oauthStatus === \"error\" && (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <AlertCircle\n aria-hidden=\"true\"\n className=\"h-8 w-8 text-destructive\"\n />\n <div>\n <p className=\"text-sm font-medium text-destructive\">\n Falha na conexão\n </p>\n {oauthResult?.error && (\n <p className=\"text-xs text-muted-foreground\">\n {oauthResult.error}\n </p>\n )}\n </div>\n <Button variant=\"outline\" onClick={onStartOAuth} size=\"sm\">\n Tentar novamente\n </Button>\n </div>\n )}\n </div>\n\n {/* Security note */}\n <div className=\"flex items-start gap-2 rounded-md bg-muted/50 p-3\">\n <Shield\n aria-hidden=\"true\"\n className=\"mt-0.5 h-4 w-4 shrink-0 text-green-600\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Seus dados estão seguros. Usamos OAuth 2.0 para autenticação — nunca\n armazenamos sua senha. Você pode revogar o acesso a qualquer momento\n nas configurações da sua conta {providerLabel}.\n </p>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// API Key flow UI\n// ---------------------------------------------------------------------------\n\nfunction ApiKeyCredentials({\n apiKey,\n onApiKeyChange,\n}: {\n apiKey: string;\n onApiKeyChange: (value: string) => void;\n}) {\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold\">Autenticação</h3>\n <p className=\"text-sm text-muted-foreground\">\n Insira a chave de API para conectar a integração.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"integration-api-key\">Chave de API</Label>\n <Input\n id=\"integration-api-key\"\n type=\"password\"\n autoComplete=\"off\"\n placeholder=\"Insira sua chave de API...\"\n value={apiKey}\n onChange={(e) => onApiKeyChange(e.target.value)}\n />\n </div>\n\n <div className=\"flex items-start gap-2 rounded-md bg-muted/50 p-3\">\n <Shield\n aria-hidden=\"true\"\n className=\"mt-0.5 h-4 w-4 shrink-0 text-green-600\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Sua chave de API é armazenada de forma segura e encriptada. Nunca é\n exposta no frontend.\n </p>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Loader2 } from \"lucide-react\";\nimport {\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@greatapps/greatauth-ui/ui\";\nimport type { IntegrationDefinition } from \"../../../data/integrations-registry\";\n\nexport interface ConfigOption {\n id: string;\n label: string;\n description?: string;\n}\n\ninterface ConfigStepProps {\n integration: IntegrationDefinition;\n /** Available options loaded from backend (e.g. calendars) */\n options: ConfigOption[];\n isLoading: boolean;\n selectedValue: string;\n onValueChange: (value: string) => void;\n /** Custom label for the select dropdown */\n selectLabel?: string;\n /** Custom placeholder */\n selectPlaceholder?: string;\n}\n\nexport function ConfigStep({\n integration,\n options,\n isLoading,\n selectedValue,\n onValueChange,\n selectLabel,\n selectPlaceholder,\n}: ConfigStepProps) {\n const label = selectLabel || getDefaultLabel(integration.slug);\n const placeholder =\n selectPlaceholder || getDefaultPlaceholder(integration.slug);\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold\">Configuração</h3>\n <p className=\"text-sm text-muted-foreground\">\n Configure as opções específicas da integração.\n </p>\n </div>\n\n {isLoading ? (\n <div className=\"flex flex-col items-center gap-3 py-8\">\n <Loader2\n aria-hidden=\"true\"\n className=\"h-6 w-6 animate-spin text-muted-foreground\"\n />\n <p className=\"text-sm text-muted-foreground\">\n Carregando opções...\n </p>\n </div>\n ) : options.length === 0 ? (\n <div className=\"rounded-lg border border-dashed p-6 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma opção disponível. A configuração padrão será usada.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <Label htmlFor=\"integration-config-select\">{label}</Label>\n <Select value={selectedValue} onValueChange={onValueChange}>\n <SelectTrigger id=\"integration-config-select\">\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => (\n <SelectItem key={opt.id} value={opt.id}>\n <span>{opt.label}</span>\n {opt.description && (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n ({opt.description})\n </span>\n )}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getDefaultLabel(slug: string): string {\n switch (slug) {\n case \"google_calendar\":\n return \"Calendário\";\n default:\n return \"Opção\";\n }\n}\n\nfunction getDefaultPlaceholder(slug: string): string {\n switch (slug) {\n case \"google_calendar\":\n return \"Selecione o calendário...\";\n default:\n return \"Selecione uma opção...\";\n }\n}\n","'use client';\n\nimport { CheckCircle2 } from \"lucide-react\";\nimport { Label } from \"@greatapps/greatauth-ui/ui\";\nimport type { IntegrationDefinition } from \"../../../data/integrations-registry\";\nimport type { OAuthResult } from \"../types\";\nimport type { ConfigOption } from \"./config-step\";\n\ninterface ConfirmStepProps {\n integration: IntegrationDefinition;\n oauthResult: OAuthResult | null;\n selectedConfigOption: ConfigOption | null;\n enableOnComplete: boolean;\n onEnableChange: (enabled: boolean) => void;\n}\n\nexport function ConfirmStep({\n integration,\n oauthResult,\n selectedConfigOption,\n enableOnComplete,\n onEnableChange,\n}: ConfirmStepProps) {\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold\">Confirmação</h3>\n <p className=\"text-sm text-muted-foreground\">\n Revise as configurações antes de concluir.\n </p>\n </div>\n\n {/* Summary */}\n <div className=\"space-y-3 rounded-lg border p-4\">\n <SummaryRow label=\"Integração\" value={integration.name} />\n\n {oauthResult?.email && (\n <SummaryRow label=\"Conta conectada\" value={oauthResult.email} />\n )}\n\n {selectedConfigOption && (\n <SummaryRow\n label={getConfigLabel(integration.slug)}\n value={selectedConfigOption.label}\n />\n )}\n\n <SummaryRow\n label=\"Tipo de autenticação\"\n value={integration.authType === \"oauth2\" ? \"OAuth 2.0\" : \"API Key\"}\n />\n </div>\n\n {/* Enable toggle */}\n <div className=\"flex items-center justify-between rounded-lg border p-4\">\n <div className=\"space-y-0.5\">\n <Label htmlFor=\"enable-on-complete\" className=\"text-sm font-medium\">\n Ativar imediatamente\n </Label>\n <p className=\"text-xs text-muted-foreground\">\n A integração ficará ativa assim que concluir o assistente.\n </p>\n </div>\n <button\n id=\"enable-on-complete\"\n role=\"switch\"\n type=\"button\"\n aria-checked={enableOnComplete}\n onClick={() => onEnableChange(!enableOnComplete)}\n className={`\n relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent\n transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-2\n focus-visible:ring-ring focus-visible:ring-offset-2\n ${enableOnComplete ? \"bg-primary\" : \"bg-muted\"}\n `}\n >\n <span\n aria-hidden=\"true\"\n className={`\n pointer-events-none inline-block h-5 w-5 transform rounded-full bg-background shadow-lg\n ring-0 transition duration-200 ease-in-out\n ${enableOnComplete ? \"translate-x-5\" : \"translate-x-0\"}\n `}\n />\n </button>\n </div>\n\n {/* Success indicator */}\n <div className=\"flex items-center gap-2 rounded-md bg-green-50 p-3 dark:bg-green-950/20\">\n <CheckCircle2\n aria-hidden=\"true\"\n className=\"h-4 w-4 shrink-0 text-green-600\"\n />\n <p className=\"text-xs text-green-700 dark:text-green-400\">\n Tudo pronto! Clique em "Concluir" para finalizar a\n configuração.\n </p>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction SummaryRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium\">{value}</span>\n </div>\n );\n}\n\nfunction getConfigLabel(slug: string): string {\n switch (slug) {\n case \"google_calendar\":\n return \"Calendário\";\n default:\n return \"Configuração\";\n }\n}\n","import { useState } from \"react\";\nimport { AgentsTable } from \"../components/agents/agents-table\";\nimport { AgentFormDialog } from \"../components/agents/agent-form-dialog\";\nimport { Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plus } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\n\nexport interface AgentsPageProps {\n config: GagentsHookConfig;\n onNavigateToAgent?: (agentId: number) => void;\n title?: string;\n subtitle?: string;\n}\n\nexport function AgentsPage({\n config,\n onNavigateToAgent,\n title = \"Agentes AI\",\n subtitle = \"Gerencie seus agentes de atendimento inteligente\",\n}: AgentsPageProps) {\n const [createOpen, setCreateOpen] = useState(false);\n\n return (\n <div className=\"flex flex-col gap-4 p-4 md:p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <Button onClick={() => setCreateOpen(true)} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Agente\n </Button>\n </div>\n\n <AgentsTable config={config} onNavigateToAgent={onNavigateToAgent} />\n\n <AgentFormDialog\n config={config}\n open={createOpen}\n onOpenChange={setCreateOpen}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useAgent } from \"../hooks\";\nimport { AgentTabs } from \"../components/agents/agent-tabs\";\nimport { AgentEditForm } from \"../components/agents/agent-edit-form\";\nimport { Badge, Button, Skeleton } from \"@greatapps/greatauth-ui/ui\";\nimport { EntityAvatar } from \"@greatapps/greatauth-ui\";\nimport { ArrowLeft, Pencil } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\n\nexport interface AgentDetailPageProps {\n config: GagentsHookConfig;\n agentId: number;\n onBack?: () => void;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nexport function AgentDetailPage({\n config,\n agentId,\n onBack,\n renderChatLink,\n}: AgentDetailPageProps) {\n const { data: agent, isLoading } = useAgent(config, agentId);\n const [editOpen, setEditOpen] = useState(false);\n\n if (isLoading) {\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-10 w-full\" />\n <Skeleton className=\"h-64 w-full\" />\n </div>\n );\n }\n\n if (!agent) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 p-8\">\n <p className=\"text-muted-foreground\">Agente não encontrado</p>\n {onBack && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onBack}>\n <ArrowLeft className=\"mr-2 h-4 w-4\" />\n Voltar para agentes\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-4 md:p-6\">\n <div className=\"rounded-lg border p-4 md:p-6\">\n <div className=\"flex flex-col gap-4 md:flex-row md:items-start md:gap-6\">\n <div className=\"flex items-start gap-3 flex-1\">\n {onBack && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Voltar\"\n className=\"shrink-0 mt-1\"\n onClick={onBack}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n )}\n\n <EntityAvatar photo={agent.photo} name={agent.title} size=\"xl\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h1 className=\"text-xl font-semibold\">{agent.title}</h1>\n <Badge\n variant={agent.active ? \"default\" : \"destructive\"}\n className=\"text-xs\"\n >\n {agent.active ? \"Ativo\" : \"Inativo\"}\n </Badge>\n </div>\n </div>\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"shrink-0 self-start\"\n onClick={() => setEditOpen(true)}\n >\n <Pencil className=\"mr-2 h-4 w-4\" />\n Editar\n </Button>\n </div>\n </div>\n\n <AgentTabs\n agent={agent}\n config={config}\n renderChatLink={renderChatLink}\n />\n\n {editOpen && (\n <AgentEditForm\n agent={agent}\n config={config}\n idAccount={config.accountId}\n open={editOpen}\n onOpenChange={setEditOpen}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Blocks, Plug, Settings } from \"lucide-react\";\n\nimport type { GagentsHookConfig } from \"../hooks/types\";\nimport { CapabilitiesTab } from \"../components/capabilities/capabilities-tab\";\nimport { IntegrationsTab } from \"../components/capabilities/integrations-tab\";\nimport { AdvancedTab } from \"../components/capabilities/advanced-tab\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface AgentCapabilitiesPageProps {\n config: GagentsHookConfig;\n agentId: number;\n gagentsApiUrl: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AgentCapabilitiesPage({\n config,\n agentId,\n gagentsApiUrl,\n}: AgentCapabilitiesPageProps) {\n return (\n <div className=\"space-y-4\">\n <div>\n <h2 className=\"text-lg font-semibold\">Capacidades e Integrações</h2>\n <p className=\"text-sm text-muted-foreground\">\n Configure o que este agente pode fazer e quais integrações ele utiliza.\n </p>\n </div>\n\n <Tabs defaultValue=\"capacidades\">\n <TabsList>\n <TabsTrigger value=\"capacidades\" className=\"flex items-center gap-1.5\">\n <Blocks aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Capacidades\n </TabsTrigger>\n <TabsTrigger value=\"integracoes\" className=\"flex items-center gap-1.5\">\n <Plug aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Integrações\n </TabsTrigger>\n <TabsTrigger value=\"avancado\" className=\"flex items-center gap-1.5\">\n <Settings aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Avançado\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"capacidades\" className=\"mt-4\">\n <CapabilitiesTab config={config} agentId={agentId} />\n </TabsContent>\n\n <TabsContent value=\"integracoes\" className=\"mt-4\">\n <IntegrationsTab config={config} agentId={agentId} />\n </TabsContent>\n\n <TabsContent value=\"avancado\" className=\"mt-4\">\n <AdvancedTab\n config={config}\n agentId={agentId}\n gagentsApiUrl={gagentsApiUrl}\n />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { ToolsTable } from \"../components/tools/tools-table\";\nimport { ToolFormDialog } from \"../components/tools/tool-form-dialog\";\nimport { Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plus } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\nimport type { Tool } from \"../types\";\n\nexport interface ToolsPageProps {\n config: GagentsHookConfig;\n title?: string;\n subtitle?: string;\n}\n\nexport function ToolsPage({\n config,\n title = \"Ferramentas\",\n subtitle = \"Gerencie as ferramentas disponíveis para seus agentes\",\n}: ToolsPageProps) {\n const [createOpen, setCreateOpen] = useState(false);\n const [editTool, setEditTool] = useState<Tool | undefined>(undefined);\n\n return (\n <div className=\"flex flex-col gap-4 p-4 md:p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <Button onClick={() => setCreateOpen(true)} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Nova Ferramenta\n </Button>\n </div>\n\n <ToolsTable config={config} onEdit={(tool) => setEditTool(tool)} />\n\n <ToolFormDialog\n config={config}\n open={createOpen}\n onOpenChange={setCreateOpen}\n />\n\n <ToolFormDialog\n config={config}\n open={!!editTool}\n onOpenChange={(open) => !open && setEditTool(undefined)}\n tool={editTool}\n />\n </div>\n );\n}\n","import { useToolCredentials } from \"../hooks\";\nimport { ToolCredentialsForm } from \"../components/tools/tool-credentials-form\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\n\nexport interface CredentialsPageProps {\n config: GagentsHookConfig;\n gagentsApiUrl: string;\n title?: string;\n subtitle?: string;\n}\n\nexport function CredentialsPage({\n config,\n gagentsApiUrl,\n title = \"Credenciais\",\n subtitle = \"Gerencie as credenciais de autenticação das ferramentas\",\n}: CredentialsPageProps) {\n const { data: credentialsData, isLoading: credentialsLoading } =\n useToolCredentials(config);\n\n const credentials = credentialsData?.data || [];\n\n return (\n <div className=\"flex flex-col gap-4 p-4 md:p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n </div>\n\n <ToolCredentialsForm\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n credentials={credentials}\n isLoading={credentialsLoading}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useCallback, useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useToolCredentials, useAgents, useTools } from \"../hooks\";\nimport { IntegrationCard } from \"../components/capabilities/integration-card\";\nimport { IntegrationWizard } from \"../components/capabilities/integration-wizard\";\nimport { useIntegrationState, type IntegrationCardData } from \"../hooks/use-integrations\";\nimport { useDeleteToolCredential, useUpdateToolCredential } from \"../hooks/use-settings\";\nimport type { WizardIntegrationMeta } from \"../components/capabilities/types\";\nimport type { ConfigOption } from \"../components/capabilities/wizard-steps/config-step\";\nimport { Plug, Loader2 } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\nimport type { Agent, Tool, ToolCredential } from \"../types\";\n\nexport interface IntegrationsManagementPageProps {\n config: GagentsHookConfig;\n gagentsApiUrl: string;\n /** Resolve wizard metadata for a given integration card. */\n resolveWizardMeta?: (card: IntegrationCardData) => WizardIntegrationMeta;\n /** Load config options after OAuth completes (e.g. list of calendars). */\n loadConfigOptions?: (credentialId: number) => Promise<ConfigOption[]>;\n /** Called after wizard completes successfully. */\n onWizardComplete?: () => void;\n title?: string;\n subtitle?: string;\n}\n\nexport function IntegrationsManagementPage({\n config,\n gagentsApiUrl,\n resolveWizardMeta,\n loadConfigOptions,\n onWizardComplete,\n title = \"Integrações\",\n subtitle = \"Gerencie as integrações da conta.\",\n}: IntegrationsManagementPageProps) {\n const queryClient = useQueryClient();\n\n // Integration cards state (account-level, agentId=null)\n const { cards, isLoading: cardsLoading } = useIntegrationState(config, null);\n\n // Wizard state\n const [wizardOpen, setWizardOpen] = useState(false);\n const [activeCard, setActiveCard] = useState<IntegrationCardData | null>(null);\n\n // Mutations for card actions\n const deleteCredential = useDeleteToolCredential(config);\n const updateCredential = useUpdateToolCredential(config);\n\n const handleConnect = useCallback((card: IntegrationCardData) => {\n setActiveCard(card);\n setWizardOpen(true);\n }, []);\n\n const handleReconnect = useCallback((card: IntegrationCardData) => {\n setActiveCard(card);\n setWizardOpen(true);\n }, []);\n\n const handleDisconnect = useCallback((card: IntegrationCardData) => {\n if (!card.credentialId) return;\n updateCredential.mutate({\n id: card.credentialId,\n body: { status: \"inactive\" },\n });\n }, [updateCredential]);\n\n const handleDelete = useCallback((card: IntegrationCardData) => {\n if (!card.credentialId) return;\n deleteCredential.mutate(card.credentialId);\n }, [deleteCredential]);\n\n const handleWizardClose = useCallback((open: boolean) => {\n if (!open) {\n setActiveCard(null);\n }\n setWizardOpen(open);\n }, []);\n\n const handleWizardComplete = useCallback(() => {\n // Invalidate ALL queries that useIntegrationState and related hooks depend on.\n // Use broad prefix-based invalidation to cover every accountId/param variant.\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tool-credentials\"] });\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tools\"] });\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agent-tools\"] });\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agent-capabilities\"] });\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"capabilities\"] });\n\n setWizardOpen(false);\n setActiveCard(null);\n onWizardComplete?.();\n }, [onWizardComplete, queryClient]);\n\n // Resolve wizard meta with sensible defaults\n const wizardMeta: WizardIntegrationMeta | null = activeCard\n ? (resolveWizardMeta?.(activeCard) ?? {\n capabilities: [],\n requirements: [],\n hasConfigStep: false,\n })\n : null;\n\n // Split integration cards\n const connectedCards = cards.filter(\n (c) => !c.isAddNew && (c.state === \"connected\" || c.state === \"expired\"),\n );\n const otherCards = cards.filter(\n (c) => c.isAddNew || c.state === \"coming_soon\",\n );\n\n return (\n <div className=\"flex flex-col gap-4 p-4 md:p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n </div>\n\n {cardsLoading ? (\n <div className=\"flex items-center justify-center py-16\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n ) : cards.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-3 py-16 text-muted-foreground\">\n <Plug className=\"h-10 w-10\" />\n <p className=\"text-sm\">Nenhuma integração disponível</p>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {/* Connected accounts */}\n {connectedCards.length > 0 && (\n <div>\n <h3 className=\"mb-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\">\n Contas conectadas\n </h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {connectedCards.map((card) => (\n <IntegrationCard\n key={`${card.definition.slug}-cred-${card.credentialId}`}\n card={card}\n onConnect={handleConnect}\n onReconnect={handleReconnect}\n onDisconnect={handleDisconnect}\n onDelete={handleDelete}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Add new / coming soon */}\n {otherCards.length > 0 && (\n <div>\n {connectedCards.length > 0 && (\n <h3 className=\"mb-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\">\n Adicionar integração\n </h3>\n )}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {otherCards.map((card) => {\n const key = card.isAddNew\n ? `${card.definition.slug}-add-new`\n : card.definition.slug;\n return (\n <IntegrationCard\n key={key}\n card={card}\n onConnect={handleConnect}\n />\n );\n })}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Integration Wizard */}\n {activeCard && wizardMeta && (\n <IntegrationWizard\n open={wizardOpen}\n onOpenChange={handleWizardClose}\n integration={activeCard.definition}\n meta={wizardMeta}\n agentId={0}\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n existingCredentialId={activeCard.credentialId}\n onComplete={handleWizardComplete}\n loadConfigOptions={loadConfigOptions}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useMemo","useMemo","useMemo","useMemo","useState","Button","Input","toast","jsx","jsxs","useState","useEffect","useState","Button","Input","Label","Switch","Sheet","SheetContent","SheetHeader","SheetTitle","SheetFooter","Loader2","toast","ImageCropUpload","jsx","jsxs","msToSeconds","secondsToMs","agentToFormState","useState","useEffect","useState","Input","Button","Switch","Textarea","Label","Badge","Sheet","SheetContent","SheetHeader","SheetTitle","SheetFooter","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","React","jsx","useCallback","useState","Button","Trash2","jsx","jsxs","useState","useCallback","Button","Trash2","Pencil","Plus","GripVertical","toast","jsx","jsxs","useState","Button","Badge","Switch","Sheet","SheetContent","SheetHeader","SheetTitle","Label","Input","Textarea","SheetFooter","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","useState","useRef","useCallback","useEffect","useMemo","Button","Label","Loader2","toast","jsx","jsxs","useRef","useCallback","useEffect","useState","useMemo","toast","Label","Button","Loader2","useState","useMemo","Button","Badge","Skeleton","toast","Fragment","jsx","jsxs","useState","useMemo","useState","Skeleton","Badge","Skeleton","Button","X","jsx","jsxs","jsx","jsxs","useState","Skeleton","Badge","jsx","useState","useCallback","useEffect","useMemo","Switch","Badge","Button","Skeleton","Loader2","Pencil","toast","jsx","jsxs","useState","useEffect","useMemo","useCallback","toast","Skeleton","Button","Badge","Loader2","Switch","Pencil","useCallback","useState","useEffect","useMemo","Switch","Tooltip","TooltipContent","TooltipTrigger","Checkbox","Button","Loader2","ChevronDown","Pencil","toast","jsx","jsxs","useState","useEffect","useMemo","useCallback","toast","Loader2","Tooltip","TooltipTrigger","TooltipContent","ChevronDown","Switch","Checkbox","Pencil","Button","Target","MessageCircle","Plug","jsx","jsxs","useState","Switch","Badge","Button","Skeleton","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Input","Textarea","Dialog","DialogContent","DialogHeader","DialogTitle","Label","Trash2","Plus","Settings2","toast","jsx","jsxs","useState","useMemo","useState","DataTable","Input","Badge","Tooltip","TooltipTrigger","TooltipContent","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Button","Pencil","Trash2","Search","format","ptBR","toast","Fragment","jsx","jsxs","useColumns","useState","useMemo","useState","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Input","Textarea","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Loader2","toast","jsx","jsxs","slugify","useState","useMemo","useState","DataTable","Input","Button","Badge","Tooltip","TooltipTrigger","TooltipContent","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Trash2","Search","format","ptBR","toast","jsx","jsxs","formatDate","useColumns","useState","useMemo","useState","Badge","Button","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","CalendarSync","Plug","Settings","Plus","Trash2","Fragment","jsx","jsxs","ICON_MAP","CalendarSync","Plug","Settings","Plus","resolveIcon","useState","Button","badge","Badge","Trash2","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","useState","jsx","jsxs","useState","useCallback","useEffect","useRef","useState","Dialog","DialogContent","DialogFooter","DialogHeader","DialogTitle","Button","Loader2","Check","toast","Info","jsx","jsxs","Loader2","Button","Input","Label","jsx","jsxs","Loader2","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","jsx","jsxs","CheckCircle2","Label","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","toast","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Loader2","Check","useState","Button","Plus","jsx","jsxs","useState","useState","Badge","Button","Skeleton","EntityAvatar","Pencil","jsx","jsxs","useState","Tabs","TabsList","TabsTrigger","TabsContent","Blocks","Plug","Settings","jsx","jsxs","Tabs","TabsList","TabsTrigger","Blocks","Plug","Settings","TabsContent","useState","Button","Plus","jsx","jsxs","useState","jsx","jsxs","useCallback","useState","useQueryClient","Plug","Loader2","jsx","jsxs","useQueryClient","useState","useCallback"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/index.ts","../src/lib/index.ts","../src/hooks/types.ts","../src/hooks/use-agents.ts","../src/hooks/use-tools.ts","../src/hooks/use-objectives.ts","../src/hooks/use-agent-tools.ts","../src/hooks/use-conversations.ts","../src/hooks/use-settings.ts","../src/hooks/use-contacts.ts","../src/hooks/use-capabilities.ts","../src/hooks/use-integrations.ts","../src/data/integrations-registry.ts","../src/components/agents/agents-table.tsx","../src/components/agents/agent-form-dialog.tsx","../src/components/agents/agent-edit-form.tsx","../src/components/agents/agent-objectives-list.tsx","../src/components/ui/sortable.tsx","../src/lib/compose-refs.ts","../src/components/agents/conversation-flow-editor.tsx","../src/components/agents/agent-definition-editor.tsx","../src/components/agents/agent-revision-tab.tsx","../src/components/conversations/agent-conversations-table.tsx","../src/components/conversations/conversation-view.tsx","../src/components/conversations/agent-conversations-panel.tsx","../src/components/capabilities/capabilities-tab.tsx","../src/components/capabilities/integrations-tab.tsx","../src/components/agents/agent-tabs.tsx","../src/components/agents/agent-tools-list.tsx","../src/components/tools/tools-table.tsx","../src/components/tools/tool-form-dialog.tsx","../src/components/tools/tool-credentials-form.tsx","../src/components/capabilities/integration-card.tsx","../src/components/capabilities/advanced-tab.tsx","../src/components/capabilities/integration-wizard.tsx","../src/components/capabilities/wizard-steps/info-step.tsx","../src/components/capabilities/wizard-steps/credentials-step.tsx","../src/components/capabilities/wizard-steps/config-step.tsx","../src/components/capabilities/wizard-steps/confirm-step.tsx","../src/pages/agents-page.tsx","../src/pages/agent-detail-page.tsx","../src/pages/agent-capabilities-page.tsx","../src/pages/tools-page.tsx","../src/pages/credentials-page.tsx","../src/pages/integrations-management-page.tsx"],"sourcesContent":["import type {\n ApiResponse,\n Agent,\n AgentTool,\n AvailabilityResult,\n CalendarStatus,\n ContactUser,\n Conversation,\n GagentsContact,\n Objective,\n PromptVersion,\n Tool,\n ToolCredential,\n} from \"../types\";\nimport type { AgentCapability, AgentCapabilitiesPayload, CapabilitiesResponse } from \"../types/capabilities\";\n\nexport interface GagentsClientConfig {\n baseUrl: string;\n token: string;\n language?: string;\n idWl?: number;\n}\n\nexport function createGagentsClient(config: GagentsClientConfig) {\n const { baseUrl, token, language = \"pt-br\", idWl = 1 } = config;\n\n function buildUrl(idAccount: number, path: string): string {\n return `${baseUrl}/v1/${language}/${idWl}/accounts/${idAccount}/${path}`;\n }\n\n async function request<T>(\n method: string,\n idAccount: number,\n path: string,\n body?: unknown,\n params?: Record<string, string>,\n ): Promise<ApiResponse<T>> {\n const url = new URL(buildUrl(idAccount, path));\n if (params) {\n Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));\n }\n\n const res = await fetch(url.toString(), {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n let message = `HTTP ${res.status}: ${res.statusText}`;\n try {\n const errorBody = await res.json();\n message = errorBody.message || message;\n } catch {\n /* ignore parse errors */\n }\n throw new Error(message);\n }\n\n const json: ApiResponse<T> = await res.json();\n\n // For mutations, treat API-level failures as errors so TanStack Query\n // fires onError instead of onSuccess (API returns HTTP 200 even on failure)\n if (method !== \"GET\" && json.status === 0) {\n throw new Error(json.message || \"Operação falhou\");\n }\n\n return json;\n }\n\n return {\n // --- Agents ---\n listAgents: (idAccount: number, params?: Record<string, string>) =>\n request<Agent[]>(\"GET\", idAccount, \"agents\", undefined, params),\n\n getAgent: (idAccount: number, id: number) =>\n request<Agent>(\"GET\", idAccount, `agents/${id}`),\n\n createAgent: (\n idAccount: number,\n body: Pick<Agent, \"title\"> &\n Partial<Pick<Agent, \"photo\" | \"delay_typing\" | \"waiting_time\">>,\n ) => request<Agent>(\"POST\", idAccount, \"agents\", body),\n\n updateAgent: (\n idAccount: number,\n id: number,\n body: Partial<\n Pick<Agent, \"title\" | \"photo\" | \"delay_typing\" | \"waiting_time\" | \"active\" | \"identity\" | \"mission\" | \"tone_style_format\" | \"rules\" | \"conversation_flow\" | \"context\">\n > & { change_notes?: string },\n ) => request<Agent>(\"PUT\", idAccount, `agents/${id}`, body),\n\n deleteAgent: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `agents/${id}`),\n\n // --- Tools ---\n listTools: (idAccount: number, params?: Record<string, string>) =>\n request<Tool[]>(\"GET\", idAccount, \"tools\", undefined, params),\n\n getTool: (idAccount: number, id: number) =>\n request<Tool>(\"GET\", idAccount, `tools/${id}`),\n\n createTool: (\n idAccount: number,\n body: Pick<Tool, \"name\" | \"type\"> &\n Partial<Pick<Tool, \"slug\" | \"description\" | \"auth_config\" | \"function_definitions\">>,\n ) => request<Tool>(\"POST\", idAccount, \"tools\", body),\n\n updateTool: (\n idAccount: number,\n id: number,\n body: Partial<\n Pick<Tool, \"name\" | \"slug\" | \"type\" | \"description\" | \"auth_config\" | \"function_definitions\">\n >,\n ) => request<Tool>(\"PUT\", idAccount, `tools/${id}`, body),\n\n deleteTool: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `tools/${id}`),\n\n // --- Agent Tools ---\n listAgentTools: (idAccount: number, idAgent: number, params?: Record<string, string>) =>\n request<AgentTool[]>(\"GET\", idAccount, `agents/${idAgent}/tools`, undefined, params),\n\n addAgentTool: (\n idAccount: number,\n idAgent: number,\n body: Pick<AgentTool, \"id_tool\"> &\n Partial<Pick<AgentTool, \"enabled\" | \"custom_instructions\" | \"parameter_mappings\" | \"id_tool_credential\">>,\n ) => request<AgentTool>(\"POST\", idAccount, `agents/${idAgent}/tools`, body),\n\n updateAgentTool: (\n idAccount: number,\n idAgent: number,\n id: number,\n body: Partial<\n Pick<AgentTool, \"enabled\" | \"custom_instructions\" | \"parameter_mappings\" | \"id_tool_credential\">\n >,\n ) => request<AgentTool>(\"PUT\", idAccount, `agents/${idAgent}/tools/${id}`, body),\n\n removeAgentTool: (idAccount: number, idAgent: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `agents/${idAgent}/tools/${id}`),\n\n // --- Objectives ---\n listObjectives: (idAccount: number, idAgent: number, params?: Record<string, string>) =>\n request<Objective[]>(\"GET\", idAccount, `agents/${idAgent}/objectives`, undefined, params),\n\n getObjective: (idAccount: number, idAgent: number, id: number) =>\n request<Objective>(\"GET\", idAccount, `agents/${idAgent}/objectives/${id}`),\n\n createObjective: (\n idAccount: number,\n idAgent: number,\n body: Pick<Objective, \"title\"> &\n Partial<Pick<Objective, \"slug\" | \"instruction\" | \"description\" | \"conversation_flow\" | \"rules\" | \"order\" | \"active\">>,\n ) => request<Objective>(\"POST\", idAccount, `agents/${idAgent}/objectives`, body),\n\n updateObjective: (\n idAccount: number,\n idAgent: number,\n id: number,\n body: Partial<Pick<Objective, \"title\" | \"slug\" | \"instruction\" | \"description\" | \"conversation_flow\" | \"rules\" | \"order\" | \"active\">>,\n ) => request<Objective>(\"PUT\", idAccount, `agents/${idAgent}/objectives/${id}`, body),\n\n deleteObjective: (idAccount: number, idAgent: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `agents/${idAgent}/objectives/${id}`),\n\n // --- Conversations ---\n listConversations: (idAccount: number, params?: Record<string, string>) =>\n request<Conversation[]>(\"GET\", idAccount, \"conversations\", undefined, params),\n\n listAgentConversations: (idAccount: number, idAgent: number, params?: Record<string, string>) =>\n request<Conversation[]>(\"GET\", idAccount, `agents/${idAgent}/conversations`, undefined, params),\n\n getConversation: (idAccount: number, id: number) =>\n request<Conversation>(\"GET\", idAccount, `conversations/${id}`),\n\n // --- Prompt Versions ---\n listPromptVersions: (idAccount: number, idAgent: number, params?: Record<string, string>) =>\n request<PromptVersion[]>(\"GET\", idAccount, `agents/${idAgent}/prompt-versions`, undefined, params),\n\n // --- Tool Credentials ---\n listToolCredentials: (idAccount: number, params?: Record<string, string>) =>\n request<ToolCredential[]>(\"GET\", idAccount, \"tool-credentials\", undefined, params),\n\n createToolCredential: (\n idAccount: number,\n body: Pick<ToolCredential, \"id_tool\" | \"label\" | \"credentials_encrypted\"> &\n Partial<Pick<ToolCredential, \"expires_at\">>,\n ) => request<ToolCredential>(\"POST\", idAccount, \"tool-credentials\", body),\n\n updateToolCredential: (\n idAccount: number,\n id: number,\n body: Partial<\n Pick<ToolCredential, \"id_tool\" | \"label\" | \"credentials_encrypted\" | \"expires_at\" | \"status\">\n >,\n ) => request<ToolCredential>(\"PUT\", idAccount, `tool-credentials/${id}`, body),\n\n deleteToolCredential: (idAccount: number, id: number) =>\n request<void>(\"DELETE\", idAccount, `tool-credentials/${id}`),\n\n // --- Contact Users ---\n listContactUsers: (idAccount: number, params?: Record<string, string>) =>\n request<ContactUser[]>(\"GET\", idAccount, \"contact-users\", undefined, params),\n\n getContactUser: (idAccount: number, id: number) =>\n request<ContactUser>(\"GET\", idAccount, `contact-users/${id}`),\n\n // --- Contacts ---\n listGagentsContacts: (idAccount: number, params?: Record<string, string>) =>\n request<GagentsContact[]>(\"GET\", idAccount, \"contacts\", undefined, params),\n\n // --- Calendar Integration ---\n initiateCalendarConnect: (\n idAccount: number,\n body: { external_reference: string; provider?: string },\n ) => request<{ auth_url: string }>(\"POST\", idAccount, \"calendar/connect\", body),\n\n getCalendarStatus: (\n idAccount: number,\n externalReference: string,\n provider = \"google-calendar\",\n ) =>\n request<CalendarStatus>(\n \"GET\",\n idAccount,\n `calendar/status/${encodeURIComponent(externalReference)}`,\n undefined,\n { provider },\n ),\n\n checkCalendarAvailability: (\n idAccount: number,\n body: { id_professional: number; start_time: string; end_time: string },\n ) => request<AvailabilityResult>(\"POST\", idAccount, \"calendar/availability\", body),\n\n disconnectCalendar: (\n idAccount: number,\n externalReference: string,\n provider = \"google-calendar\",\n ) =>\n request<void>(\n \"DELETE\",\n idAccount,\n `calendar/disconnect/${encodeURIComponent(externalReference)}`,\n undefined,\n { provider },\n ),\n\n // --- Capabilities ---\n getCapabilities: (idAccount: number) =>\n request<CapabilitiesResponse>(\"GET\", idAccount, \"capabilities\"),\n\n getAgentCapabilities: (idAccount: number, idAgent: number) =>\n request<AgentCapability[]>(\"GET\", idAccount, `agents/${idAgent}/capabilities`),\n\n updateAgentCapabilities: (\n idAccount: number,\n idAgent: number,\n body: AgentCapabilitiesPayload,\n ) => request<AgentCapability[]>(\"PUT\", idAccount, `agents/${idAgent}/capabilities`, body),\n };\n}\n\nexport type GagentsClient = ReturnType<typeof createGagentsClient>;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useMemo } from \"react\";\nimport { createGagentsClient } from \"../client\";\n\n// ---------------------------------------------------------------------------\n// Hook Configuration\n// ---------------------------------------------------------------------------\n\nexport interface GagentsHookConfig {\n accountId: number;\n token: string;\n baseUrl: string;\n language?: string;\n idWl?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper — memoized client from config\n// ---------------------------------------------------------------------------\n\nexport function useGagentsClient(config: GagentsHookConfig) {\n return useMemo(\n () =>\n createGagentsClient({\n baseUrl: config.baseUrl,\n token: config.token,\n language: config.language,\n idWl: config.idWl,\n }),\n [config.baseUrl, config.token, config.language, config.idWl],\n );\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useAgents(config: GagentsHookConfig, params?: Record<string, string>) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"agents\", config.accountId, params],\n queryFn: () => client.listAgents(config.accountId, params),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useAgent(config: GagentsHookConfig, id: number | null) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"agent\", config.accountId, id],\n queryFn: () => client.getAgent(config.accountId, id!),\n enabled: !!config.token && !!config.accountId && !!id,\n select: (res) => {\n const d = res.data;\n return Array.isArray(d) ? d[0] : d;\n },\n });\n}\n\nexport function useCreateAgent(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: {\n title: string;\n photo?: string;\n delay_typing?: number;\n waiting_time?: number;\n }) => client.createAgent(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agents\"] });\n },\n });\n}\n\nexport function useUpdateAgent(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: {\n title?: string;\n identity?: string | null;\n mission?: string | null;\n tone_style_format?: string | null;\n rules?: string | null;\n conversation_flow?: string | null;\n context?: string | null;\n change_notes?: string;\n photo?: string;\n delay_typing?: number;\n waiting_time?: number;\n active?: boolean;\n };\n }) => client.updateAgent(config.accountId, id, body),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agents\"] });\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"agent\", config.accountId, variables.id],\n });\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"prompt-versions\", config.accountId, variables.id],\n });\n },\n });\n}\n\nexport function useDeleteAgent(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteAgent(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agents\"] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useTools(config: GagentsHookConfig, params?: Record<string, string>) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"tools\", config.accountId, params],\n queryFn: () => client.listTools(config.accountId, params),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useTool(config: GagentsHookConfig, id: number | null) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"tool\", config.accountId, id],\n queryFn: () => client.getTool(config.accountId, id!),\n enabled: !!config.token && !!config.accountId && !!id,\n select: (res) => {\n const d = res.data;\n return Array.isArray(d) ? d[0] : d;\n },\n });\n}\n\nexport function useCreateTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: {\n name: string;\n slug: string;\n type: string;\n description?: string;\n function_definitions?: string;\n }) => client.createTool(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tools\"] });\n },\n });\n}\n\nexport function useUpdateTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: {\n name?: string;\n type?: string;\n description?: string;\n function_definitions?: string;\n };\n }) => client.updateTool(config.accountId, id, body),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tools\"] });\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"tool\", config.accountId, variables.id],\n });\n },\n });\n}\n\nexport function useDeleteTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteTool(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tools\"] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useObjectives(config: GagentsHookConfig, idAgent: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"objectives\", config.accountId, idAgent],\n queryFn: () => client.listObjectives(config.accountId, idAgent),\n enabled: !!config.token && !!config.accountId && !!idAgent,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useCreateObjective(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n idAgent,\n body,\n }: {\n idAgent: number;\n body: {\n title: string;\n slug?: string;\n instruction?: string | null;\n description?: string | null;\n conversation_flow?: string | null;\n rules?: string | null;\n order?: number;\n active?: boolean;\n };\n }) => client.createObjective(config.accountId, idAgent, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"objectives\"] });\n },\n });\n}\n\nexport function useUpdateObjective(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n idAgent,\n id,\n body,\n }: {\n idAgent: number;\n id: number;\n body: Partial<{\n title: string;\n slug: string;\n instruction: string | null;\n description: string | null;\n conversation_flow: string | null;\n rules: string | null;\n order: number;\n active: boolean;\n }>;\n }) => client.updateObjective(config.accountId, idAgent, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"objectives\"] });\n },\n });\n}\n\nexport function useDeleteObjective(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ idAgent, id }: { idAgent: number; id: number }) =>\n client.deleteObjective(config.accountId, idAgent, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"objectives\"] });\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useAgentTools(config: GagentsHookConfig, idAgent: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"agent-tools\", config.accountId, idAgent],\n queryFn: () => client.listAgentTools(config.accountId, idAgent),\n enabled: !!config.token && !!config.accountId && !!idAgent,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useAddAgentTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n idAgent,\n body,\n }: {\n idAgent: number;\n body: { id_tool: number; enabled?: boolean; custom_instructions?: string };\n }) => client.addAgentTool(config.accountId, idAgent, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agent-tools\"] });\n },\n });\n}\n\nexport function useRemoveAgentTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ idAgent, id }: { idAgent: number; id: number }) =>\n client.removeAgentTool(config.accountId, idAgent, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agent-tools\"] });\n },\n });\n}\n\nexport function useUpdateAgentTool(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n idAgent,\n id,\n body,\n }: {\n idAgent: number;\n id: number;\n body: Partial<{\n enabled: boolean;\n custom_instructions: string | null;\n parameter_mappings: string | null;\n id_tool_credential: number | null;\n }>;\n }) => client.updateAgentTool(config.accountId, idAgent, id, body),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"agent-tools\", config.accountId, variables.idAgent],\n });\n },\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useConversations(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"conversations\", config.accountId],\n queryFn: () => client.listConversations(config.accountId),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useAgentConversations(config: GagentsHookConfig, idAgent: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"conversations\", config.accountId, \"agent\", idAgent],\n queryFn: () => client.listAgentConversations(config.accountId, idAgent),\n enabled: !!config.token && !!config.accountId && !!idAgent,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useConversation(config: GagentsHookConfig, id: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"conversations\", config.accountId, id],\n queryFn: () => client.getConversation(config.accountId, id),\n enabled: !!config.token && !!config.accountId && !!id,\n select: (res) => {\n const d = res.data;\n return Array.isArray(d) ? d[0] : d;\n },\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { ToolCredential } from \"../types\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\n// --- Prompt Versions (read-only) ---\n\nexport function usePromptVersions(config: GagentsHookConfig, idAgent: number) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"prompt-versions\", config.accountId, idAgent],\n queryFn: () => client.listPromptVersions(config.accountId, idAgent),\n enabled: !!config.token && !!config.accountId && !!idAgent,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\n// --- Tool Credentials (CRUD) ---\n\nexport function useToolCredentials(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"tool-credentials\", config.accountId],\n queryFn: () => client.listToolCredentials(config.accountId),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n\nexport function useCreateToolCredential(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (\n body: Pick<ToolCredential, \"id_tool\" | \"label\" | \"credentials_encrypted\"> &\n Partial<Pick<ToolCredential, \"expires_at\">>,\n ) => client.createToolCredential(config.accountId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tool-credentials\"] });\n },\n });\n}\n\nexport function useUpdateToolCredential(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({\n id,\n body,\n }: {\n id: number;\n body: Partial<\n Pick<ToolCredential, \"id_tool\" | \"label\" | \"credentials_encrypted\" | \"expires_at\" | \"status\">\n >;\n }) => client.updateToolCredential(config.accountId, id, body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tool-credentials\"] });\n },\n });\n}\n\nexport function useDeleteToolCredential(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (id: number) => client.deleteToolCredential(config.accountId, id),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tool-credentials\"] });\n },\n });\n}\n\n// --- Contact Users (read-only) ---\n\nexport function useContactUsers(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"contact-users\", config.accountId],\n queryFn: () => client.listContactUsers(config.accountId),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\n\nexport function useGagentsContacts(config: GagentsHookConfig, params?: Record<string, string>) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"contacts\", config.accountId, params],\n queryFn: () => client.listGagentsContacts(config.accountId, params),\n enabled: !!config.token && !!config.accountId,\n select: (res) => ({ data: res.data || [], total: res.total || 0 }),\n });\n}\n","import { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useGagentsClient } from \"./types\";\nimport type { CapabilitiesResponse, AgentCapability, AgentCapabilitiesPayload } from \"../types/capabilities\";\n\nexport function useCapabilities(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"capabilities\", config.accountId],\n queryFn: async (): Promise<CapabilitiesResponse> => {\n const res = await client.getCapabilities(config.accountId);\n return (res.data as unknown as CapabilitiesResponse) ?? { product: null, categories: [] };\n },\n enabled: !!config.token && !!config.accountId,\n });\n}\n\nexport function useAgentCapabilities(config: GagentsHookConfig, agentId: number | null) {\n const client = useGagentsClient(config);\n\n return useQuery({\n queryKey: [\"greatagents\", \"agent-capabilities\", config.accountId, agentId],\n queryFn: async (): Promise<AgentCapability[]> => {\n const res = await client.getAgentCapabilities(config.accountId, agentId!);\n const d = res.data;\n return (Array.isArray(d) ? d : []) as AgentCapability[];\n },\n enabled: !!config.token && !!config.accountId && !!agentId,\n });\n}\n\nexport function useUpdateAgentCapabilities(config: GagentsHookConfig) {\n const client = useGagentsClient(config);\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: ({ agentId, payload }: { agentId: number; payload: AgentCapabilitiesPayload }) =>\n client.updateAgentCapabilities(config.accountId, agentId, payload),\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"agent-capabilities\", config.accountId, variables.agentId],\n });\n // Also invalidate agent-tools since capabilities map to tools\n queryClient.invalidateQueries({\n queryKey: [\"greatagents\", \"agent-tools\"],\n });\n },\n });\n}\n","import { useMemo } from \"react\";\nimport type { GagentsHookConfig } from \"./types\";\nimport { useToolCredentials } from \"./use-settings\";\nimport { useAgentTools } from \"./use-agent-tools\";\nimport { useTools } from \"./use-tools\";\nimport {\n INTEGRATIONS_REGISTRY,\n type IntegrationDefinition,\n} from \"../data/integrations-registry\";\nimport type { AgentTool, Tool, ToolCredential } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type IntegrationCardState =\n | \"available\"\n | \"connected\"\n | \"expired\"\n | \"coming_soon\";\n\nexport interface IntegrationCardData {\n /** Static definition from registry */\n definition: IntegrationDefinition;\n /** Resolved visual state */\n state: IntegrationCardState;\n /** Matching credential if one exists */\n credential: ToolCredential | null;\n /** Matching tool record if one exists */\n tool: Tool | null;\n /** How many agents share this credential */\n sharedByAgentsCount: number;\n /** Whether this agent has a linked agent_tool for this integration */\n linkedToAgent: boolean;\n /** Credential ID — set for connected/expired cards, undefined for \"add new\" */\n credentialId?: number;\n /** Account label (email or label from credential) */\n accountLabel?: string;\n /** Whether this is the \"add new account\" card */\n isAddNew?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Cross-references the static integrations registry with live data\n * (tools, tool_credentials, agent_tools) to produce card state for each\n * integration entry.\n *\n * Returns:\n * - One card per existing credential (connected/expired)\n * - One \"add new\" card per integration type\n * - Coming soon cards as before\n */\nexport function useIntegrationState(\n config: GagentsHookConfig,\n agentId: number | null,\n) {\n const { data: credentialsData, isLoading: loadingCredentials } =\n useToolCredentials(config);\n const { data: toolsData, isLoading: loadingTools } = useTools(config);\n const { data: agentToolsData, isLoading: loadingAgentTools } = useAgentTools(\n config,\n agentId ?? 0,\n );\n\n const isLoading = loadingCredentials || loadingTools || loadingAgentTools;\n\n const cards: IntegrationCardData[] = useMemo(() => {\n const credentials: ToolCredential[] = credentialsData?.data ?? [];\n const tools: Tool[] = toolsData?.data ?? [];\n const agentTools: AgentTool[] = agentToolsData?.data ?? [];\n\n const result: IntegrationCardData[] = [];\n\n for (const def of INTEGRATIONS_REGISTRY) {\n // coming_soon short-circuit\n if (def.status === \"coming_soon\") {\n result.push({\n definition: def,\n state: \"coming_soon\" as const,\n credential: null,\n tool: null,\n sharedByAgentsCount: 0,\n linkedToAgent: false,\n });\n continue;\n }\n\n // Find tool record matching registry slug\n const matchedTool = tools.find((t) => t.slug === def.slug) ?? null;\n\n // Find ALL credentials for this integration\n // Credentials can be linked via id_tool OR id_platform_integration\n // We match by tool slug through the tool record\n const matchedCredentials = matchedTool\n ? credentials.filter((c) => c.id_tool === matchedTool.id)\n : [];\n\n // Also check credentials linked via platform_integration\n // These credentials have id_platform_integration set but no id_tool,\n // typically created by OAuth callbacks (e.g. Google Calendar)\n const piCredentials = credentials.filter(\n (c) =>\n c.id_platform_integration != null &&\n !c.id_tool,\n );\n\n // Combine: merge tool-based and PI-based credentials, dedup by id.\n // Previously PI credentials were only included when matchedTool was null,\n // which caused connected integrations to not appear after OAuth.\n const seenIds = new Set<number>();\n const allCredentials: ToolCredential[] = [];\n for (const cred of [...matchedCredentials, ...piCredentials]) {\n if (!seenIds.has(cred.id)) {\n seenIds.add(cred.id);\n allCredentials.push(cred);\n }\n }\n\n // Check if this agent has a linked agent_tool for this tool\n const linkedToAgent = matchedTool\n ? agentTools.some((at) => at.id_tool === matchedTool.id)\n : false;\n\n // Create one card per existing credential\n for (const cred of allCredentials) {\n const state: IntegrationCardState =\n cred.status === \"expired\" ? \"expired\" : \"connected\";\n\n // Derive account label from external_reference or label\n const accountLabel =\n cred.external_reference || cred.label || undefined;\n\n result.push({\n definition: def,\n state,\n credential: cred,\n tool: matchedTool,\n sharedByAgentsCount: 1,\n linkedToAgent,\n credentialId: cred.id,\n accountLabel,\n });\n }\n\n // Always add an \"add new account\" card for this integration type\n result.push({\n definition: def,\n state: \"available\" as const,\n credential: null,\n tool: matchedTool,\n sharedByAgentsCount: 0,\n linkedToAgent: false,\n isAddNew: true,\n });\n }\n\n return result;\n }, [credentialsData, toolsData, agentToolsData]);\n\n return { cards, isLoading };\n}\n","export type IntegrationAuthType = \"oauth2\" | \"api_key\" | \"none\";\nexport type IntegrationStatus = \"available\" | \"coming_soon\";\n\nexport interface IntegrationDefinition {\n slug: string;\n name: string;\n description: string;\n icon: string; // Lucide icon name\n authType: IntegrationAuthType;\n status: IntegrationStatus;\n}\n\nexport const INTEGRATIONS_REGISTRY: IntegrationDefinition[] = [\n {\n slug: \"google-calendar\",\n name: \"Google Agenda\",\n description: \"Sincronize agendamentos com o Google Calendar\",\n icon: \"CalendarSync\",\n authType: \"oauth2\",\n status: \"available\",\n },\n // Future integrations — add entries here without code changes\n];\n","import { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { useAgents, useDeleteAgent } from \"../../hooks\";\nimport type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { DataTable } from \"@greatapps/greatauth-ui\";\nimport {\n Input,\n Badge,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Pencil, Trash2, Search } from \"lucide-react\";\nimport { EntityAvatar } from \"@greatapps/greatauth-ui\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\nfunction useColumns(\n onEdit: (agent: Agent) => void,\n onDelete: (id: number) => void,\n): ColumnDef<Agent>[] {\n return [\n {\n accessorKey: \"title\",\n header: \"Nome\",\n cell: ({ row }) => (\n <div className=\"flex items-center gap-2\">\n <EntityAvatar photo={row.original.photo} name={row.original.title} size=\"sm\" />\n <span className=\"font-medium\">{row.original.title}</span>\n </div>\n ),\n sortingFn: (rowA, rowB) =>\n rowA.original.title\n .toLowerCase()\n .localeCompare(rowB.original.title.toLowerCase()),\n },\n {\n accessorKey: \"active\",\n header: \"Status\",\n cell: ({ row }) =>\n row.original.active ? (\n <Badge variant=\"default\">Ativo</Badge>\n ) : (\n <Badge variant=\"secondary\">Inativo</Badge>\n ),\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {format(new Date(row.original.datetime_add), \"dd/MM/yyyy\", {\n locale: ptBR,\n })}\n </span>\n ),\n },\n {\n id: \"actions\",\n size: 80,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label=\"Editar\"\n onClick={() => onEdit(row.original)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Editar</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n aria-label=\"Excluir\"\n onClick={() => onDelete(row.original.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Excluir</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport function AgentsTable({ config, onNavigateToAgent }: { config: GagentsHookConfig; onNavigateToAgent?: (agentId: number) => void }) {\n const [search, setSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n\n const queryParams = useMemo(() => {\n const params: Record<string, string> = {\n limit: \"15\",\n page: String(page),\n };\n if (search) {\n params.search = search;\n }\n return params;\n }, [search, page]);\n\n const { data, isLoading } = useAgents(config, queryParams);\n const deleteAgent = useDeleteAgent(config);\n const [deleteId, setDeleteId] = useState<number | null>(null);\n\n const agents = data?.data || [];\n const total = data?.total || 0;\n\n const columns = useColumns(\n (agent) => onNavigateToAgent?.(agent.id),\n (id) => setDeleteId(id),\n );\n\n function handleDelete() {\n if (!deleteId) return;\n deleteAgent.mutate(deleteId, {\n onSuccess: () => {\n toast.success(\"Agente excluído\");\n setDeleteId(null);\n },\n onError: () => toast.error(\"Erro ao excluir agente\"),\n });\n }\n\n function handleSearchChange(value: string) {\n setSearch(value);\n setPage(1);\n }\n\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search aria-hidden=\"true\" className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar agentes\\u2026\"\n aria-label=\"Buscar agentes\"\n name=\"search\"\n autoComplete=\"off\"\n value={search}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={agents}\n isLoading={isLoading}\n emptyMessage=\"Nenhum agente encontrado\"\n total={total}\n page={page}\n onPageChange={setPage}\n pageSize={15}\n />\n\n {/* Delete confirmation */}\n <AlertDialog\n open={!!deleteId}\n onOpenChange={(open) => !open && setDeleteId(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir agente?</AlertDialogTitle>\n <AlertDialogDescription>\n Esta ação não pode ser desfeita. O agente será removido\n permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel variant=\"outline\" size=\"default\">\n Cancelar\n </AlertDialogCancel>\n <AlertDialogAction\n variant=\"default\"\n size=\"default\"\n onClick={handleDelete}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useCreateAgent, useUpdateAgent } from \"../../hooks\";\nimport type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetFooter,\n Button,\n Input,\n Label,\n Switch,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { ImageCropUpload } from \"@greatapps/greatauth-ui\";\n\ninterface AgentFormDialogProps {\n config: GagentsHookConfig;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n agent?: Agent;\n idAccount?: string | number | null;\n}\n\ninterface FormState {\n title: string;\n photo: string;\n active: boolean;\n delayTyping: string;\n waitingTime: string;\n titleError: boolean;\n}\n\nfunction msToSeconds(ms: number | null | undefined): string {\n if (ms == null || ms === 0) return \"\";\n return String(Math.round(ms / 1000));\n}\n\nfunction secondsToMs(seconds: string): number | undefined {\n const val = parseFloat(seconds);\n if (isNaN(val) || val <= 0) return undefined;\n return Math.round(val * 1000);\n}\n\nfunction agentToFormState(agent: Agent): FormState {\n return {\n title: agent.title,\n photo: agent.photo || \"\",\n active: agent.active,\n delayTyping: msToSeconds(agent.delay_typing),\n waitingTime: msToSeconds(agent.waiting_time),\n titleError: false,\n };\n}\n\nconst emptyFormState: FormState = {\n title: \"\",\n photo: \"\",\n active: true,\n delayTyping: \"\",\n waitingTime: \"\",\n titleError: false,\n};\n\nexport function AgentFormDialog({\n config,\n open,\n onOpenChange,\n agent,\n idAccount,\n}: AgentFormDialogProps) {\n const isEditing = !!agent;\n const createAgent = useCreateAgent(config);\n const updateAgent = useUpdateAgent(config);\n\n const [form, setForm] = useState<FormState>(emptyFormState);\n\n /* eslint-disable react-hooks/set-state-in-effect -- form state sync from props */\n useEffect(() => {\n if (agent) {\n setForm(agentToFormState(agent));\n } else {\n setForm(emptyFormState);\n }\n }, [agent, open]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n function updateField<K extends keyof FormState>(key: K, value: FormState[K]) {\n setForm((prev) => ({ ...prev, [key]: value }));\n }\n\n const isPending = createAgent.isPending || updateAgent.isPending;\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n\n if (!form.title.trim()) {\n updateField(\"titleError\", true);\n return;\n }\n\n const body: Record<string, unknown> = {\n title: form.title.trim(),\n active: form.active,\n };\n if (form.photo.trim()) body.photo = form.photo.trim();\n else if (isEditing) body.photo = \"\";\n\n const delayMs = secondsToMs(form.delayTyping);\n if (delayMs !== undefined) body.delay_typing = delayMs;\n else if (isEditing) body.delay_typing = 0;\n\n const waitingMs = secondsToMs(form.waitingTime);\n if (waitingMs !== undefined) body.waiting_time = waitingMs;\n else if (isEditing) body.waiting_time = 0;\n\n try {\n if (isEditing) {\n await updateAgent.mutateAsync({ id: agent.id, body });\n toast.success(\"Agente atualizado\");\n } else {\n await createAgent.mutateAsync(\n body as { title: string; prompt?: string; photo?: string; delay_typing?: number; waiting_time?: number },\n );\n toast.success(\"Agente criado\");\n }\n onOpenChange(false);\n } catch {\n toast.error(isEditing ? \"Erro ao atualizar agente\" : \"Erro ao criar agente\");\n }\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"sm:max-w-md\">\n <SheetHeader>\n <SheetTitle>\n {isEditing ? \"Editar Agente\" : \"Novo Agente\"}\n </SheetTitle>\n </SheetHeader>\n <form onSubmit={handleSubmit} className=\"flex flex-1 flex-col overflow-hidden\">\n <div className=\"flex-1 overflow-y-auto px-4 space-y-4\">\n <div className=\"flex justify-center\">\n <ImageCropUpload\n value={form.photo || null}\n onChange={(url) => updateField(\"photo\", url)}\n onRemove={() => updateField(\"photo\", \"\")}\n entityType=\"agents\"\n entityId={agent?.id}\n idAccount={typeof idAccount === \"string\" ? Number(idAccount) : (idAccount ?? Number(config.accountId) ?? 0)}\n name={form.title || null}\n disabled={isPending}\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"agent-title\">Nome do Agente *</Label>\n <Input\n id=\"agent-title\"\n name=\"title\"\n value={form.title}\n onChange={(e) => {\n setForm((prev) => ({\n ...prev,\n title: e.target.value,\n titleError: e.target.value.trim() ? false : prev.titleError,\n }));\n }}\n placeholder=\"Ex: Assistente de Agendamento\"\n required\n disabled={isPending}\n />\n {form.titleError && (\n <p className=\"text-sm text-destructive\">Nome é obrigatório</p>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Switch\n id=\"agent-active\"\n checked={form.active}\n onCheckedChange={(checked) => updateField(\"active\", checked)}\n disabled={isPending}\n />\n <Label htmlFor=\"agent-active\" className=\"cursor-pointer\">\n {form.active ? \"Ativo\" : \"Inativo\"}\n </Label>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"agent-delay\">Delay de Digitação (s)</Label>\n <Input\n id=\"agent-delay\"\n name=\"delay\"\n type=\"number\"\n value={form.delayTyping}\n onChange={(e) => updateField(\"delayTyping\", e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"0.5\"\n disabled={isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Tempo de simulação de digitação\n </p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"agent-waiting\">Tempo de Espera (s)</Label>\n <Input\n id=\"agent-waiting\"\n name=\"waiting\"\n type=\"number\"\n value={form.waitingTime}\n onChange={(e) => updateField(\"waitingTime\", e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"0.5\"\n disabled={isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Espera por mensagens agrupadas\n </p>\n </div>\n </div>\n </div>\n <SheetFooter className=\"flex-row justify-end border-t\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={isPending || !form.title.trim()}>\n {isPending ? (\n <Loader2 aria-hidden=\"true\" className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : null}\n {isEditing ? \"Salvar\" : \"Criar\"}\n </Button>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useUpdateAgent } from \"../../hooks\";\nimport type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n Button,\n Input,\n Label,\n Switch,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetFooter,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { ImageCropUpload } from \"@greatapps/greatauth-ui\";\n\ninterface AgentEditFormProps {\n config: GagentsHookConfig;\n agent: Agent;\n idAccount: string | number | null;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\ninterface FormState {\n title: string;\n photo: string;\n active: boolean;\n delayTyping: string;\n waitingTime: string;\n titleError: boolean;\n}\n\nfunction msToSeconds(ms: number | null): string {\n if (ms == null || ms === 0) return \"\";\n return String(Math.round(ms / 1000));\n}\n\nfunction secondsToMs(seconds: string): number | undefined {\n const val = parseFloat(seconds);\n if (isNaN(val) || val <= 0) return undefined;\n return Math.round(val * 1000);\n}\n\nfunction agentToFormState(agent: Agent): FormState {\n return {\n title: agent.title,\n photo: agent.photo || \"\",\n active: agent.active,\n delayTyping: msToSeconds(agent.delay_typing),\n waitingTime: msToSeconds(agent.waiting_time),\n titleError: false,\n };\n}\n\nexport function AgentEditForm({ config, agent, idAccount, open, onOpenChange }: AgentEditFormProps) {\n const updateAgent = useUpdateAgent(config);\n const [form, setForm] = useState<FormState>(() => agentToFormState(agent));\n\n useEffect(() => {\n setForm(agentToFormState(agent));\n }, [agent]);\n\n function updateField<K extends keyof FormState>(key: K, value: FormState[K]) {\n setForm((prev) => ({ ...prev, [key]: value }));\n }\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n\n if (!form.title.trim()) {\n updateField(\"titleError\", true);\n return;\n }\n\n const body: Record<string, unknown> = {\n title: form.title.trim(),\n active: form.active,\n };\n if (form.photo.trim()) body.photo = form.photo.trim();\n else body.photo = \"\";\n\n const delayMs = secondsToMs(form.delayTyping);\n if (delayMs !== undefined) body.delay_typing = delayMs;\n else body.delay_typing = 0;\n\n const waitingMs = secondsToMs(form.waitingTime);\n if (waitingMs !== undefined) body.waiting_time = waitingMs;\n else body.waiting_time = 0;\n\n try {\n await updateAgent.mutateAsync({ id: agent.id, body });\n toast.success(\"Agente atualizado\");\n onOpenChange?.(false);\n } catch {\n toast.error(\"Erro ao atualizar agente\");\n }\n }\n\n const formFields = (\n <>\n <div className=\"flex justify-center\">\n <ImageCropUpload\n value={form.photo || null}\n onChange={(url) => updateField(\"photo\", url)}\n onRemove={() => updateField(\"photo\", \"\")}\n entityType=\"agents\"\n entityId={agent.id}\n idAccount={typeof idAccount === \"string\" ? Number(idAccount) : (idAccount ?? 0)}\n name={form.title || null}\n disabled={updateAgent.isPending}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-title\">Nome do Agente *</Label>\n <Input\n id=\"edit-title\"\n name=\"title\"\n value={form.title}\n onChange={(e) => {\n setForm((prev) => ({\n ...prev,\n title: e.target.value,\n titleError: e.target.value.trim() ? false : prev.titleError,\n }));\n }}\n placeholder=\"Ex: Assistente de Agendamento\"\n disabled={updateAgent.isPending}\n />\n {form.titleError && (\n <p className=\"text-sm text-destructive\">Nome é obrigatório</p>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n <Switch\n id=\"edit-active\"\n checked={form.active}\n onCheckedChange={(checked) => updateField(\"active\", checked)}\n disabled={updateAgent.isPending}\n />\n <Label htmlFor=\"edit-active\" className=\"cursor-pointer\">\n {form.active ? \"Ativo\" : \"Inativo\"}\n </Label>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-delay\">Delay de Digitação (s)</Label>\n <Input\n id=\"edit-delay\"\n name=\"delay\"\n type=\"number\"\n value={form.delayTyping}\n onChange={(e) => updateField(\"delayTyping\", e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"0.5\"\n disabled={updateAgent.isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Tempo de simulação de digitação\n </p>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"edit-waiting\">Tempo de Espera (s)</Label>\n <Input\n id=\"edit-waiting\"\n name=\"waiting\"\n type=\"number\"\n value={form.waitingTime}\n onChange={(e) => updateField(\"waitingTime\", e.target.value)}\n placeholder=\"0\"\n min=\"0\"\n step=\"0.5\"\n disabled={updateAgent.isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Espera por mensagens agrupadas\n </p>\n </div>\n </div>\n </>\n );\n\n if (open !== undefined && onOpenChange) {\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"sm:max-w-md\">\n <SheetHeader>\n <SheetTitle>Editar Agente</SheetTitle>\n </SheetHeader>\n <form onSubmit={handleSubmit} className=\"flex flex-1 flex-col overflow-hidden\">\n <div className=\"flex-1 overflow-y-auto px-4 space-y-4\">\n {formFields}\n </div>\n <SheetFooter className=\"flex-row justify-end border-t\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange?.(false)}\n disabled={updateAgent.isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={updateAgent.isPending}>\n {updateAgent.isPending && (\n <Loader2 aria-hidden=\"true\" className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Salvar\n </Button>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div className=\"max-w-lg pt-4\">\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {formFields}\n <div className=\"flex justify-end gap-2 pt-4 border-t\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange?.(false)}\n disabled={updateAgent.isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={updateAgent.isPending}>\n {updateAgent.isPending && (\n <Loader2 aria-hidden=\"true\" className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Salvar\n </Button>\n </div>\n </form>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { Agent, Objective, ConversationFlowStep } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n useObjectives,\n useCreateObjective,\n useUpdateObjective,\n useDeleteObjective,\n} from \"../../hooks\";\nimport {\n Input,\n Button,\n Switch,\n Skeleton,\n Textarea,\n Label,\n Badge,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetFooter,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n Sortable,\n SortableContent,\n SortableItem,\n SortableItemHandle,\n SortableOverlay,\n} from \"../ui/sortable\";\nimport { ConversationFlowEditor } from \"./conversation-flow-editor\";\nimport { Trash2, Target, Pencil, Plus, GripVertical } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ninterface AgentObjectivesListProps {\n agent: Agent;\n config: GagentsHookConfig;\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\ninterface ObjectiveFormState {\n title: string;\n slug: string;\n instruction: string;\n description: string;\n conversation_flow: ConversationFlowStep[];\n rules: string;\n}\n\nconst EMPTY_FORM: ObjectiveFormState = { title: \"\", slug: \"\", instruction: \"\", description: \"\", conversation_flow: [], rules: \"\" };\n\nexport function AgentObjectivesList({ agent, config }: AgentObjectivesListProps) {\n const { data: objectivesData, isLoading } = useObjectives(config, agent.id);\n const createMutation = useCreateObjective(config);\n const updateMutation = useUpdateObjective(config);\n const deleteMutation = useDeleteObjective(config);\n\n const [formOpen, setFormOpen] = useState(false);\n const [editTarget, setEditTarget] = useState<Objective | null>(null);\n const [form, setForm] = useState<ObjectiveFormState>(EMPTY_FORM);\n const [slugManual, setSlugManual] = useState(false);\n const [removeTarget, setRemoveTarget] = useState<Objective | null>(null);\n\n const objectives = objectivesData?.data || [];\n const sortedObjectives = [...objectives].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n\n async function handleReorder(newItems: Objective[]) {\n const updates = newItems\n .map((item, index) => ({ ...item, order: index + 1 }))\n .filter((item, index) => sortedObjectives[index]?.id !== item.id);\n\n try {\n for (const item of updates) {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: item.id,\n body: { order: item.order },\n });\n }\n toast.success(\"Ordem atualizada\");\n } catch {\n toast.error(\"Erro ao reordenar objetivos\");\n }\n }\n\n function openCreate() {\n setEditTarget(null);\n setForm(EMPTY_FORM);\n setSlugManual(false);\n setFormOpen(true);\n }\n\n function openEdit(objective: Objective) {\n setEditTarget(objective);\n let parsedFlow: ConversationFlowStep[] = [];\n if (objective.conversation_flow) {\n try { parsedFlow = JSON.parse(objective.conversation_flow); } catch { /* invalid JSON */ }\n }\n setForm({\n title: objective.title,\n slug: objective.slug || \"\",\n instruction: objective.instruction || \"\",\n description: objective.description || \"\",\n conversation_flow: parsedFlow,\n rules: objective.rules || \"\",\n });\n setSlugManual(true);\n setFormOpen(true);\n }\n\n async function handleSubmit() {\n if (!form.title.trim()) return;\n\n const effectiveSlug = form.slug.trim() || slugify(form.title);\n const nextOrder =\n sortedObjectives.length > 0\n ? Math.max(...sortedObjectives.map((o) => o.order)) + 1\n : 1;\n\n try {\n const bodyFields = {\n title: form.title.trim(),\n slug: effectiveSlug,\n instruction: form.instruction.trim() || null,\n description: form.description.trim() || null,\n conversation_flow: form.conversation_flow.length > 0 ? JSON.stringify(form.conversation_flow) : null,\n rules: form.rules.trim() || null,\n };\n\n if (editTarget) {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: editTarget.id,\n body: bodyFields,\n });\n toast.success(\"Objetivo atualizado\");\n } else {\n await createMutation.mutateAsync({\n idAgent: agent.id,\n body: { ...bodyFields, order: nextOrder },\n });\n toast.success(\"Objetivo criado\");\n }\n setFormOpen(false);\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : editTarget\n ? \"Erro ao atualizar objetivo\"\n : \"Erro ao criar objetivo\",\n );\n }\n }\n\n async function handleToggleActive(objective: Objective, checked: boolean) {\n try {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: objective.id,\n body: { active: checked },\n });\n toast.success(checked ? \"Objetivo ativado\" : \"Objetivo desativado\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao alterar estado do objetivo\",\n );\n }\n }\n\n async function handleRemove() {\n if (!removeTarget) return;\n try {\n await deleteMutation.mutateAsync({\n idAgent: agent.id,\n id: removeTarget.id,\n });\n toast.success(\"Objetivo removido\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao remover o objetivo\",\n );\n } finally {\n setRemoveTarget(null);\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3 p-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-14 w-full\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n {sortedObjectives.length} objetivo{sortedObjectives.length !== 1 ? \"s\" : \"\"} definido{sortedObjectives.length !== 1 ? \"s\" : \"\"}\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n Objetivos são modos de conversa que o agente ativa automaticamente conforme a intenção do utilizador.\n </p>\n </div>\n <Button onClick={openCreate} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Objetivo\n </Button>\n </div>\n\n {sortedObjectives.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <Target className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Nenhum objetivo definido. Adicione objetivos para orientar o agente em diferentes contextos.\n </p>\n </div>\n ) : (\n <Sortable\n value={sortedObjectives}\n onValueChange={handleReorder}\n getItemValue={(item) => item.id}\n >\n <SortableContent className=\"space-y-2\">\n {sortedObjectives.map((objective) => (\n <SortableItem\n key={objective.id}\n value={objective.id}\n className=\"flex items-center gap-3 rounded-lg border bg-card p-3\"\n >\n <SortableItemHandle className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <GripVertical aria-hidden=\"true\" className=\"h-5 w-5\" />\n </SortableItemHandle>\n\n <div className=\"flex flex-1 flex-col gap-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate font-medium\">\n {objective.title}\n </span>\n {objective.slug && (\n <Badge variant=\"secondary\" className=\"shrink-0 text-xs font-mono\">\n {objective.slug}\n </Badge>\n )}\n </div>\n {(objective.instruction || objective.description) && (\n <div className=\"space-y-0.5\">\n {objective.instruction && (\n <p className=\"text-xs font-medium text-muted-foreground\">\n Quando: {objective.instruction}\n </p>\n )}\n {objective.description && (\n <p className=\"line-clamp-1 text-xs text-muted-foreground\">\n {objective.description}\n </p>\n )}\n </div>\n )}\n </div>\n\n <Switch\n aria-label=\"Ativar/Desativar\"\n checked={objective.active}\n onCheckedChange={(checked) =>\n handleToggleActive(objective, checked)\n }\n disabled={updateMutation.isPending}\n />\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Editar\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => openEdit(objective)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Excluir\"\n className=\"shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={() => setRemoveTarget(objective)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </SortableItem>\n ))}\n </SortableContent>\n <SortableOverlay>\n {({ value }) => {\n const obj = sortedObjectives.find((o) => o.id === value);\n return (\n <div className=\"flex items-center gap-3 rounded-lg border bg-card p-3 shadow-lg\">\n <GripVertical aria-hidden=\"true\" className=\"h-5 w-5 text-muted-foreground\" />\n <span className=\"font-medium\">{obj?.title}</span>\n </div>\n );\n }}\n </SortableOverlay>\n </Sortable>\n )}\n\n {/* Create/Edit Sheet */}\n <Sheet open={formOpen} onOpenChange={setFormOpen}>\n <SheetContent className=\"sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>\n {editTarget ? \"Editar Objetivo\" : \"Novo Objetivo\"}\n </SheetTitle>\n </SheetHeader>\n <div className=\"flex-1 overflow-y-auto px-4 space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-title\">Título *</Label>\n <Input\n id=\"objective-title\"\n name=\"title\"\n value={form.title}\n onChange={(e) => {\n const title = e.target.value;\n setForm((f) => ({\n ...f,\n title,\n ...(!slugManual ? { slug: slugify(title) } : {}),\n }));\n }}\n placeholder=\"Ex: Agendar Consulta\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-slug\">Slug (identificador) *</Label>\n <Input\n id=\"objective-slug\"\n name=\"slug\"\n value={form.slug}\n onChange={(e) => {\n setSlugManual(true);\n setForm((f) => ({ ...f, slug: e.target.value }));\n }}\n placeholder=\"Ex: agendar-consulta\"\n className=\"font-mono\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Gerado automaticamente. Usado pelo agente para identificar o objetivo.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-instruction\">Quando ativar (instrução curta) *</Label>\n <Input\n id=\"objective-instruction\"\n name=\"instruction\"\n value={form.instruction}\n onChange={(e) =>\n setForm((f) => ({ ...f, instruction: e.target.value }))\n }\n placeholder=\"Ex: Quando o utilizador quer agendar uma consulta\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Instrução curta que diz ao agente QUANDO ativar este objetivo. Aparece na secção [OBJETIVOS] do prompt.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-description\">Descrição</Label>\n <Textarea\n id=\"objective-description\"\n name=\"description\"\n value={form.description}\n onChange={(e) =>\n setForm((f) => ({ ...f, description: e.target.value }))\n }\n placeholder=\"Descreva o propósito deste objectivo...\"\n rows={3}\n />\n <p className=\"text-xs text-muted-foreground\">\n Missão e propósito deste objectivo — o que o agente deve alcançar.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label>Fluxo de Conversa</Label>\n <ConversationFlowEditor\n steps={form.conversation_flow}\n onChange={(steps) => setForm((f) => ({ ...f, conversation_flow: steps }))}\n />\n <p className=\"text-xs text-muted-foreground\">\n Etapas que o agente segue quando este objectivo é activado.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"objective-rules\">Regras</Label>\n <Textarea\n id=\"objective-rules\"\n name=\"rules\"\n value={form.rules}\n onChange={(e) =>\n setForm((f) => ({ ...f, rules: e.target.value }))\n }\n placeholder=\"Regras específicas deste objectivo...\"\n rows={3}\n />\n <p className=\"text-xs text-muted-foreground\">\n Restrições e limites específicos quando este objectivo está activo.\n </p>\n </div>\n </div>\n <SheetFooter className=\"flex-row justify-end border-t\">\n <Button\n variant=\"outline\"\n onClick={() => setFormOpen(false)}\n >\n Cancelar\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={\n !form.title.trim() ||\n createMutation.isPending ||\n updateMutation.isPending\n }\n >\n {editTarget ? \"Salvar\" : \"Criar\"}\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n\n {/* Delete confirmation */}\n <AlertDialog\n open={!!removeTarget}\n onOpenChange={(open) => !open && setRemoveTarget(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remover objetivo?</AlertDialogTitle>\n <AlertDialogDescription>\n O objetivo será removido permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleRemove}\n disabled={deleteMutation.isPending}\n >\n Remover\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","import {\n type Announcements,\n closestCenter,\n closestCorners,\n DndContext,\n type DndContextProps,\n type DragEndEvent,\n type DraggableAttributes,\n type DraggableSyntheticListeners,\n DragOverlay,\n type DragStartEvent,\n type DropAnimation,\n defaultDropAnimationSideEffects,\n KeyboardSensor,\n MouseSensor,\n type ScreenReaderInstructions,\n TouchSensor,\n type UniqueIdentifier,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n restrictToHorizontalAxis,\n restrictToParentElement,\n restrictToVerticalAxis,\n} from \"@dnd-kit/modifiers\";\nimport {\n arrayMove,\n horizontalListSortingStrategy,\n SortableContext,\n type SortableContextProps,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { useComposedRefs } from \"../../lib/compose-refs\";\nimport { cn } from \"../../lib\";\n\nconst orientationConfig = {\n vertical: {\n modifiers: [restrictToVerticalAxis, restrictToParentElement],\n strategy: verticalListSortingStrategy,\n collisionDetection: closestCenter,\n },\n horizontal: {\n modifiers: [restrictToHorizontalAxis, restrictToParentElement],\n strategy: horizontalListSortingStrategy,\n collisionDetection: closestCenter,\n },\n mixed: {\n modifiers: [restrictToParentElement],\n strategy: undefined,\n collisionDetection: closestCorners,\n },\n};\n\nconst ROOT_NAME = \"Sortable\";\nconst CONTENT_NAME = \"SortableContent\";\nconst ITEM_NAME = \"SortableItem\";\nconst ITEM_HANDLE_NAME = \"SortableItemHandle\";\nconst OVERLAY_NAME = \"SortableOverlay\";\n\ninterface SortableRootContextValue<T> {\n id: string;\n items: UniqueIdentifier[];\n modifiers: DndContextProps[\"modifiers\"];\n strategy: SortableContextProps[\"strategy\"];\n activeId: UniqueIdentifier | null;\n setActiveId: (id: UniqueIdentifier | null) => void;\n getItemValue: (item: T) => UniqueIdentifier;\n flatCursor: boolean;\n}\n\nconst SortableRootContext =\n React.createContext<SortableRootContextValue<unknown> | null>(null);\n\nfunction useSortableContext(consumerName: string) {\n const context = React.useContext(SortableRootContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface GetItemValue<T> {\n /**\n * Callback that returns a unique identifier for each sortable item. Required for array of objects.\n * @example getItemValue={(item) => item.id}\n */\n getItemValue: (item: T) => UniqueIdentifier;\n}\n\ntype SortableProps<T> = DndContextProps &\n (T extends object ? GetItemValue<T> : Partial<GetItemValue<T>>) & {\n value: T[];\n onValueChange?: (items: T[]) => void;\n onMove?: (\n event: DragEndEvent & { activeIndex: number; overIndex: number },\n ) => void;\n strategy?: SortableContextProps[\"strategy\"];\n orientation?: \"vertical\" | \"horizontal\" | \"mixed\";\n flatCursor?: boolean;\n };\n\nfunction Sortable<T>(props: SortableProps<T>) {\n const {\n value,\n onValueChange,\n collisionDetection,\n modifiers,\n strategy,\n onMove,\n orientation = \"vertical\",\n flatCursor = false,\n getItemValue: getItemValueProp,\n accessibility,\n ...sortableProps\n } = props;\n\n const id = React.useId();\n const [activeId, setActiveId] = React.useState<UniqueIdentifier | null>(null);\n\n const sensors = useSensors(\n useSensor(MouseSensor),\n useSensor(TouchSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n const config = React.useMemo(\n () => orientationConfig[orientation],\n [orientation],\n );\n\n const getItemValue = React.useCallback(\n (item: T): UniqueIdentifier => {\n if (typeof item === \"object\" && !getItemValueProp) {\n throw new Error(\n \"`getItemValue` is required when using array of objects\",\n );\n }\n return getItemValueProp\n ? getItemValueProp(item)\n : (item as UniqueIdentifier);\n },\n [getItemValueProp],\n );\n\n const items = React.useMemo(() => {\n return value.map((item) => getItemValue(item));\n }, [value, getItemValue]);\n\n /* eslint-disable react-hooks/preserve-manual-memoization, react-hooks/exhaustive-deps -- shadcn sortable: intentional dependency on specific props */\n const onDragStart = React.useCallback(\n (event: DragStartEvent) => {\n sortableProps.onDragStart?.(event);\n\n if (event.activatorEvent.defaultPrevented) return;\n\n setActiveId(event.active.id);\n },\n [sortableProps.onDragStart],\n );\n\n const onDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n sortableProps.onDragEnd?.(event);\n\n if (event.activatorEvent.defaultPrevented) return;\n\n const { active, over } = event;\n if (over && active.id !== over?.id) {\n const activeIndex = value.findIndex(\n (item) => getItemValue(item) === active.id,\n );\n const overIndex = value.findIndex(\n (item) => getItemValue(item) === over.id,\n );\n\n if (onMove) {\n onMove({ ...event, activeIndex, overIndex });\n } else {\n onValueChange?.(arrayMove(value, activeIndex, overIndex));\n }\n }\n setActiveId(null);\n },\n [value, onValueChange, onMove, getItemValue, sortableProps.onDragEnd],\n );\n\n const onDragCancel = React.useCallback(\n (event: DragEndEvent) => {\n sortableProps.onDragCancel?.(event);\n\n if (event.activatorEvent.defaultPrevented) return;\n\n setActiveId(null);\n },\n [sortableProps.onDragCancel],\n );\n /* eslint-enable react-hooks/preserve-manual-memoization, react-hooks/exhaustive-deps */\n\n const announcements: Announcements = React.useMemo(\n () => ({\n onDragStart({ active }) {\n const activeValue = active.id.toString();\n return `Grabbed sortable item \"${activeValue}\". Current position is ${active.data.current?.sortable.index + 1} of ${value.length}. Use arrow keys to move, space to drop.`;\n },\n onDragOver({ active, over }) {\n if (over) {\n const overIndex = over.data.current?.sortable.index ?? 0;\n const activeIndex = active.data.current?.sortable.index ?? 0;\n const moveDirection = overIndex > activeIndex ? \"down\" : \"up\";\n const activeValue = active.id.toString();\n return `Sortable item \"${activeValue}\" moved ${moveDirection} to position ${overIndex + 1} of ${value.length}.`;\n }\n return \"Sortable item is no longer over a droppable area. Press escape to cancel.\";\n },\n onDragEnd({ active, over }) {\n const activeValue = active.id.toString();\n if (over) {\n const overIndex = over.data.current?.sortable.index ?? 0;\n return `Sortable item \"${activeValue}\" dropped at position ${overIndex + 1} of ${value.length}.`;\n }\n return `Sortable item \"${activeValue}\" dropped. No changes were made.`;\n },\n onDragCancel({ active }) {\n const activeIndex = active.data.current?.sortable.index ?? 0;\n const activeValue = active.id.toString();\n return `Sorting cancelled. Sortable item \"${activeValue}\" returned to position ${activeIndex + 1} of ${value.length}.`;\n },\n onDragMove({ active, over }) {\n if (over) {\n const overIndex = over.data.current?.sortable.index ?? 0;\n const activeIndex = active.data.current?.sortable.index ?? 0;\n const moveDirection = overIndex > activeIndex ? \"down\" : \"up\";\n const activeValue = active.id.toString();\n return `Sortable item \"${activeValue}\" is moving ${moveDirection} to position ${overIndex + 1} of ${value.length}.`;\n }\n return \"Sortable item is no longer over a droppable area. Press escape to cancel.\";\n },\n }),\n [value],\n );\n\n const screenReaderInstructions: ScreenReaderInstructions = React.useMemo(\n () => ({\n draggable: `\n To pick up a sortable item, press space or enter.\n While dragging, use the ${orientation === \"vertical\" ? \"up and down\" : orientation === \"horizontal\" ? \"left and right\" : \"arrow\"} keys to move the item.\n Press space or enter again to drop the item in its new position, or press escape to cancel.\n `,\n }),\n [orientation],\n );\n\n const contextValue = React.useMemo(\n () => ({\n id,\n items,\n modifiers: modifiers ?? config.modifiers,\n strategy: strategy ?? config.strategy,\n activeId,\n setActiveId,\n getItemValue,\n flatCursor,\n }),\n [\n id,\n items,\n modifiers,\n strategy,\n config.modifiers,\n config.strategy,\n activeId,\n getItemValue,\n flatCursor,\n ],\n );\n\n return (\n <SortableRootContext.Provider\n value={contextValue as SortableRootContextValue<unknown>}\n >\n <DndContext\n collisionDetection={collisionDetection ?? config.collisionDetection}\n modifiers={modifiers ?? config.modifiers}\n sensors={sensors}\n {...sortableProps}\n id={id}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={onDragCancel}\n accessibility={{\n announcements,\n screenReaderInstructions,\n ...accessibility,\n }}\n />\n </SortableRootContext.Provider>\n );\n}\n\nconst SortableContentContext = React.createContext<boolean>(false);\n\ninterface SortableContentProps extends React.ComponentProps<\"div\"> {\n strategy?: SortableContextProps[\"strategy\"];\n children: React.ReactNode;\n asChild?: boolean;\n withoutSlot?: boolean;\n}\n\nfunction SortableContent(props: SortableContentProps) {\n const {\n strategy: strategyProp,\n asChild,\n withoutSlot,\n children,\n ref,\n ...contentProps\n } = props;\n\n const context = useSortableContext(CONTENT_NAME);\n\n const ContentPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <SortableContentContext.Provider value={true}>\n <SortableContext\n items={context.items}\n strategy={strategyProp ?? context.strategy}\n >\n {withoutSlot ? (\n children\n ) : (\n <ContentPrimitive\n data-slot=\"sortable-content\"\n {...contentProps}\n ref={ref}\n >\n {children}\n </ContentPrimitive>\n )}\n </SortableContext>\n </SortableContentContext.Provider>\n );\n}\n\ninterface SortableItemContextValue {\n id: string;\n attributes: DraggableAttributes;\n listeners: DraggableSyntheticListeners | undefined;\n setActivatorNodeRef: (node: HTMLElement | null) => void;\n isDragging?: boolean;\n disabled?: boolean;\n}\n\nconst SortableItemContext =\n React.createContext<SortableItemContextValue | null>(null);\n\nfunction useSortableItemContext(consumerName: string) {\n const context = React.useContext(SortableItemContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ITEM_NAME}\\``);\n }\n return context;\n}\n\ninterface SortableItemProps extends React.ComponentProps<\"div\"> {\n value: UniqueIdentifier;\n asHandle?: boolean;\n asChild?: boolean;\n disabled?: boolean;\n}\n\nfunction SortableItem(props: SortableItemProps) {\n const {\n value,\n style,\n asHandle,\n asChild,\n disabled,\n className,\n ref,\n ...itemProps\n } = props;\n\n const inSortableContent = React.useContext(SortableContentContext);\n const inSortableOverlay = React.useContext(SortableOverlayContext);\n\n if (!inSortableContent && !inSortableOverlay) {\n throw new Error(\n `\\`${ITEM_NAME}\\` must be used within \\`${CONTENT_NAME}\\` or \\`${OVERLAY_NAME}\\``,\n );\n }\n\n if (value === \"\") {\n throw new Error(`\\`${ITEM_NAME}\\` value cannot be an empty string`);\n }\n\n const context = useSortableContext(ITEM_NAME);\n const id = React.useId();\n const {\n attributes,\n listeners,\n setNodeRef,\n setActivatorNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: value, disabled });\n\n const composedRef = useComposedRefs(ref, (node) => {\n if (disabled) return;\n setNodeRef(node);\n if (asHandle) setActivatorNodeRef(node);\n });\n\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\n return {\n transform: CSS.Translate.toString(transform),\n transition,\n ...style,\n };\n }, [transform, transition, style]);\n\n const itemContext = React.useMemo<SortableItemContextValue>(\n () => ({\n id,\n attributes,\n listeners,\n setActivatorNodeRef,\n isDragging,\n disabled,\n }),\n [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled],\n );\n\n const ItemPrimitive = asChild ? SlotPrimitive.Slot : \"div\";\n\n return (\n <SortableItemContext.Provider value={itemContext}>\n <ItemPrimitive\n id={id}\n data-disabled={disabled}\n data-dragging={isDragging ? \"\" : undefined}\n data-slot=\"sortable-item\"\n {...itemProps}\n {...(asHandle && !disabled ? attributes : {})}\n {...(asHandle && !disabled ? listeners : {})}\n ref={composedRef}\n style={composedStyle}\n className={cn(\n \"focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1\",\n {\n \"touch-none select-none\": asHandle,\n \"cursor-default\": context.flatCursor,\n \"data-dragging:cursor-grabbing\": !context.flatCursor,\n \"cursor-grab\": !isDragging && asHandle && !context.flatCursor,\n \"opacity-50\": isDragging,\n \"pointer-events-none opacity-50\": disabled,\n },\n className,\n )}\n />\n </SortableItemContext.Provider>\n );\n}\n\ninterface SortableItemHandleProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nfunction SortableItemHandle(props: SortableItemHandleProps) {\n const { asChild, disabled, className, ref, ...itemHandleProps } = props;\n\n const context = useSortableContext(ITEM_HANDLE_NAME);\n const itemContext = useSortableItemContext(ITEM_HANDLE_NAME);\n\n const isDisabled = disabled ?? itemContext.disabled;\n\n const composedRef = useComposedRefs(ref, (node) => {\n if (!isDisabled) return;\n itemContext.setActivatorNodeRef(node);\n });\n\n const HandlePrimitive = asChild ? SlotPrimitive.Slot : \"button\";\n\n return (\n <HandlePrimitive\n type=\"button\"\n aria-controls={itemContext.id}\n data-disabled={isDisabled}\n data-dragging={itemContext.isDragging ? \"\" : undefined}\n data-slot=\"sortable-item-handle\"\n {...itemHandleProps}\n {...(isDisabled ? {} : itemContext.attributes)}\n {...(isDisabled ? {} : itemContext.listeners)}\n ref={composedRef}\n className={cn(\n \"select-none disabled:pointer-events-none disabled:opacity-50\",\n context.flatCursor\n ? \"cursor-default\"\n : \"cursor-grab data-dragging:cursor-grabbing\",\n className,\n )}\n disabled={isDisabled}\n />\n );\n}\n\nconst SortableOverlayContext = React.createContext(false);\n\nconst dropAnimation: DropAnimation = {\n sideEffects: defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: \"0.4\",\n },\n },\n }),\n};\n\ninterface SortableOverlayProps\n extends Omit<React.ComponentProps<typeof DragOverlay>, \"children\"> {\n container?: Element | DocumentFragment | null;\n children?:\n | ((params: { value: UniqueIdentifier }) => React.ReactNode)\n | React.ReactNode;\n}\n\nfunction SortableOverlay(props: SortableOverlayProps) {\n const { container: containerProp, children, ...overlayProps } = props;\n\n const context = useSortableContext(OVERLAY_NAME);\n\n const [mounted, setMounted] = React.useState(false);\n\n React.useLayoutEffect(() => setMounted(true), []);\n\n const container =\n containerProp ?? (mounted ? globalThis.document?.body : null);\n\n if (!container) return null;\n\n return ReactDOM.createPortal(\n <DragOverlay\n dropAnimation={dropAnimation}\n modifiers={context.modifiers}\n className={cn(!context.flatCursor && \"cursor-grabbing\")}\n {...overlayProps}\n >\n <SortableOverlayContext.Provider value={true}>\n {context.activeId\n ? typeof children === \"function\"\n ? children({ value: context.activeId })\n : children\n : null}\n </SortableOverlayContext.Provider>\n </DragOverlay>,\n container,\n );\n}\n\nexport {\n Sortable,\n SortableContent,\n SortableItem,\n SortableItemHandle,\n SortableOverlay,\n //\n type SortableProps,\n};\n","import * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === \"function\") {\n return ref(value);\n }\n if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup === \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup === \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n","import { useCallback, useRef, useState } from \"react\";\nimport type { ConversationFlowStep } from \"../../types\";\nimport { Button, Textarea } from \"@greatapps/greatauth-ui/ui\";\nimport {\n Sortable,\n SortableContent,\n SortableItem,\n SortableItemHandle,\n SortableOverlay,\n} from \"../ui/sortable\";\nimport { GripVertical, Plus, Trash2 } from \"lucide-react\";\n\ninterface StepWithKey extends ConversationFlowStep {\n _key: number;\n}\n\ninterface ConversationFlowEditorProps {\n steps: ConversationFlowStep[];\n onChange: (steps: ConversationFlowStep[]) => void;\n disabled?: boolean;\n}\n\nfunction renumber(steps: ConversationFlowStep[]): ConversationFlowStep[] {\n return steps.map((s, i) => ({ ...s, order: i + 1 }));\n}\n\nfunction stripKeys(steps: StepWithKey[]): ConversationFlowStep[] {\n return steps.map(({ _key, ...rest }) => rest);\n}\n\nexport function ConversationFlowEditor({\n steps,\n onChange,\n}: ConversationFlowEditorProps) {\n const nextKey = useRef(steps.length + 1);\n\n const [internal, setInternal] = useState<StepWithKey[]>(() =>\n steps.map((s, i) => ({ ...s, _key: i + 1 })),\n );\n\n const sync = useCallback(\n (next: StepWithKey[]) => {\n const renumbered = renumber(next).map((s, i) => ({\n ...s,\n _key: next[i]._key,\n })) as StepWithKey[];\n setInternal(renumbered);\n onChange(stripKeys(renumbered));\n },\n [onChange],\n );\n\n function handleAdd() {\n nextKey.current += 1;\n const newStep: StepWithKey = {\n order: internal.length + 1,\n instruction: \"\",\n example: null,\n _key: nextKey.current,\n };\n sync([...internal, newStep]);\n }\n\n function handleRemove(key: number) {\n sync(internal.filter((s) => s._key !== key));\n }\n\n function handleFieldChange(\n key: number,\n field: \"instruction\" | \"example\",\n value: string,\n ) {\n const next = internal.map((s) => {\n if (s._key !== key) return s;\n if (field === \"example\") {\n return { ...s, example: value || null };\n }\n return { ...s, [field]: value };\n });\n sync(next);\n }\n\n function handleReorder(newItems: StepWithKey[]) {\n sync(newItems);\n }\n\n return (\n <div className=\"space-y-3\">\n {internal.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma etapa definida. Adicione a primeira etapa do fluxo de\n conversa.\n </p>\n </div>\n ) : (\n <Sortable\n value={internal}\n onValueChange={handleReorder}\n getItemValue={(item) => item._key}\n >\n <SortableContent className=\"space-y-2\">\n {internal.map((step) => (\n <SortableItem\n key={step._key}\n value={step._key}\n className=\"flex flex-col gap-2 rounded-lg border bg-card p-3\"\n >\n <div className=\"flex items-center gap-2\">\n <SortableItemHandle className=\"shrink-0 cursor-grab text-muted-foreground hover:text-foreground\">\n <GripVertical aria-hidden=\"true\" className=\"h-4 w-4\" />\n </SortableItemHandle>\n <span className=\"shrink-0 text-xs font-medium text-muted-foreground tabular-nums\">\n {step.order}.\n </span>\n <span className=\"flex-1 text-sm font-medium truncate\">{step.instruction || \"Nova etapa\"}</span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Remover etapa\"\n className=\"shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={() => handleRemove(step._key)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n <div className=\"space-y-2 pl-8\">\n <Textarea\n value={step.instruction}\n onChange={(e) =>\n handleFieldChange(step._key, \"instruction\", e.target.value)\n }\n placeholder=\"Descreva o que o agente deve fazer nesta etapa...\"\n className=\"min-h-[2.5rem] resize-none\"\n rows={2}\n />\n <Textarea\n value={step.example ?? \"\"}\n onChange={(e) =>\n handleFieldChange(step._key, \"example\", e.target.value)\n }\n placeholder=\"Exemplo de resposta do agente (opcional)\"\n className=\"min-h-[2.5rem] resize-none text-muted-foreground\"\n rows={1}\n />\n </div>\n </SortableItem>\n ))}\n </SortableContent>\n <SortableOverlay>\n {({ value }) => {\n const step = internal.find((s) => s._key === value);\n return (\n <div className=\"flex items-center gap-2 rounded-lg border bg-card p-2 shadow-lg\">\n <GripVertical\n aria-hidden=\"true\"\n className=\"h-4 w-4 text-muted-foreground\"\n />\n <span className=\"text-xs font-medium text-muted-foreground\">\n {step?.order}.\n </span>\n <span className=\"text-sm truncate\">\n {step?.instruction || \"Etapa sem instrução\"}\n </span>\n </div>\n );\n }}\n </SortableOverlay>\n </Sortable>\n )}\n\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={handleAdd}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Adicionar etapa\n </Button>\n </div>\n );\n}\n","import { useState, useRef, useCallback, useEffect, useMemo } from \"react\";\nimport type { Agent, ConversationFlowStep } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useUpdateAgent } from \"../../hooks\";\nimport { Button, Label } from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { ConversationFlowEditor } from \"./conversation-flow-editor\";\n\n// ---------------------------------------------------------------------------\n// Section config\n// ---------------------------------------------------------------------------\n\ninterface SectionDef {\n key: \"identity\" | \"mission\" | \"tone_style_format\" | \"rules\" | \"conversation_flow\" | \"context\";\n label: string;\n helper: string;\n placeholder: string;\n required?: boolean;\n field: keyof Agent;\n type: \"textarea\" | \"conversation_flow\";\n}\n\nconst SECTIONS: SectionDef[] = [\n {\n key: \"identity\",\n label: \"Identidade\",\n helper: \"Descreva quem é o agente, o seu nome e personalidade\",\n required: true,\n field: \"identity\",\n type: \"textarea\",\n placeholder: \"Você é a Ana, assistente virtual da Clínica Saúde & Bem-Estar. Você é simpática, profissional e sempre disposta a ajudar os pacientes...\",\n },\n {\n key: \"mission\",\n label: \"Missão\",\n helper: \"Qual é a missão principal deste agente\",\n required: true,\n field: \"mission\",\n type: \"textarea\",\n placeholder: \"Sua missão é ajudar pacientes a agendar consultas, tirar dúvidas sobre horários e especialidades, e fornecer informações sobre a clínica...\",\n },\n {\n key: \"tone_style_format\",\n label: \"Tom, Estilo & Formato\",\n helper: \"Defina como o agente comunica e formata as respostas\",\n required: false,\n field: \"tone_style_format\",\n type: \"textarea\",\n placeholder: \"Use tom empático e acolhedor. Responda de forma clara e objetiva, em no máximo 3 parágrafos. Use listas quando houver múltiplas opções...\",\n },\n {\n key: \"rules\",\n label: \"Regras\",\n helper: \"Limites, restrições e comportamentos obrigatórios\",\n required: false,\n field: \"rules\",\n type: \"textarea\",\n placeholder: \"Nunca forneça diagnósticos médicos. Sempre recomende consulta presencial para urgências. Não agende consultas fora do horário de funcionamento (08h-18h)...\",\n },\n {\n key: \"conversation_flow\",\n label: \"Fluxo de Conversa\",\n helper: \"Etapas que o agente segue no início de cada conversa\",\n required: false,\n field: \"conversation_flow\",\n type: \"conversation_flow\",\n placeholder: \"\",\n },\n {\n key: \"context\",\n label: \"Contexto\",\n helper: \"Informações adicionais que o agente deve saber\",\n required: false,\n field: \"context\",\n type: \"textarea\",\n placeholder: \"A clínica funciona de segunda a sexta, das 08h às 18h. Especialidades disponíveis: Cardiologia, Dermatologia, Ortopedia, Pediatria...\",\n },\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction parseConversationFlow(raw: string | null | undefined): ConversationFlowStep[] {\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed;\n return [];\n } catch {\n return [];\n }\n}\n\nfunction computeTotals(fields: Record<string, string>, steps: ConversationFlowStep[]) {\n const textChars = Object.values(fields).reduce((sum, v) => sum + v.length, 0);\n const flowChars = JSON.stringify(steps).length;\n const total = textChars + flowChars;\n return { chars: total, tokens: Math.ceil(total / 4) };\n}\n\n// ---------------------------------------------------------------------------\n// Auto-resize textarea component\n// ---------------------------------------------------------------------------\n\nfunction AutoTextarea({\n value,\n onChange,\n disabled,\n placeholder,\n ariaLabel,\n}: {\n value: string;\n onChange: (v: string) => void;\n disabled?: boolean;\n placeholder?: string;\n ariaLabel?: string;\n}) {\n const ref = useRef<HTMLTextAreaElement>(null);\n\n const autoResize = useCallback(() => {\n const el = ref.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.max(120, el.scrollHeight)}px`;\n }, []);\n\n useEffect(() => {\n autoResize();\n }, [value, autoResize]);\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLTextAreaElement>) {\n if (e.key === \"Tab\") {\n e.preventDefault();\n const el = e.currentTarget;\n const start = el.selectionStart;\n const end = el.selectionEnd;\n const newValue = el.value.substring(0, start) + \" \" + el.value.substring(end);\n onChange(newValue);\n requestAnimationFrame(() => {\n el.selectionStart = el.selectionEnd = start + 2;\n });\n }\n }\n\n return (\n <textarea\n ref={ref}\n aria-label={ariaLabel}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full resize-none rounded-lg border bg-background p-3 text-sm leading-relaxed focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50\"\n style={{ minHeight: \"120px\" }}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// AgentDefinitionEditor\n// ---------------------------------------------------------------------------\n\ninterface AgentDefinitionEditorProps {\n agent: Agent;\n config: GagentsHookConfig;\n}\n\nexport function AgentDefinitionEditor({ agent, config }: AgentDefinitionEditorProps) {\n const updateAgent = useUpdateAgent(config);\n\n // Track agent ID to reset state on agent switch\n const [trackedAgentId, setTrackedAgentId] = useState(agent.id);\n\n // Text field state\n const [fields, setFields] = useState<Record<string, string>>(() => ({\n identity: agent.identity ?? \"\",\n mission: agent.mission ?? \"\",\n tone_style_format: agent.tone_style_format ?? \"\",\n rules: agent.rules ?? \"\",\n context: agent.context ?? \"\",\n }));\n\n // Conversation flow state\n const [conversationFlowSteps, setConversationFlowSteps] = useState<ConversationFlowStep[]>(\n () => parseConversationFlow(agent.conversation_flow),\n );\n\n // Reset state when agent changes\n if (trackedAgentId !== agent.id) {\n setTrackedAgentId(agent.id);\n setFields({\n identity: agent.identity ?? \"\",\n mission: agent.mission ?? \"\",\n tone_style_format: agent.tone_style_format ?? \"\",\n rules: agent.rules ?? \"\",\n context: agent.context ?? \"\",\n });\n setConversationFlowSteps(parseConversationFlow(agent.conversation_flow));\n }\n\n function updateField(key: string, value: string) {\n setFields((prev) => ({ ...prev, [key]: value }));\n }\n\n const { chars, tokens } = computeTotals(fields, conversationFlowSteps);\n\n const hasChanges = useMemo(() => {\n if (fields.identity !== (agent.identity ?? \"\")) return true;\n if (fields.mission !== (agent.mission ?? \"\")) return true;\n if (fields.tone_style_format !== (agent.tone_style_format ?? \"\")) return true;\n if (fields.rules !== (agent.rules ?? \"\")) return true;\n if (fields.context !== (agent.context ?? \"\")) return true;\n const originalSteps = parseConversationFlow(agent.conversation_flow);\n if (JSON.stringify(conversationFlowSteps) !== JSON.stringify(originalSteps)) return true;\n return false;\n }, [fields, conversationFlowSteps, agent]);\n\n function discard() {\n setFields({\n identity: agent.identity ?? \"\",\n mission: agent.mission ?? \"\",\n tone_style_format: agent.tone_style_format ?? \"\",\n rules: agent.rules ?? \"\",\n context: agent.context ?? \"\",\n });\n setConversationFlowSteps(parseConversationFlow(agent.conversation_flow));\n }\n\n async function handleSave() {\n if (!fields.identity.trim() || !fields.mission.trim()) {\n toast.error(\"Identidade e Missão são campos obrigatórios\");\n return;\n }\n\n const body: Record<string, unknown> = {\n identity: fields.identity.trim(),\n mission: fields.mission.trim(),\n tone_style_format: fields.tone_style_format.trim() || null,\n rules: fields.rules.trim() || null,\n conversation_flow: conversationFlowSteps.length > 0\n ? JSON.stringify(conversationFlowSteps)\n : null,\n context: fields.context.trim() || null,\n };\n\n try {\n await updateAgent.mutateAsync({ id: agent.id, body });\n toast.success(\"Definição do agente salva com sucesso\");\n } catch {\n toast.error(\"Erro ao salvar definição do agente\");\n }\n }\n\n return (\n <div className=\"space-y-6 p-4\">\n {/* Sections */}\n {SECTIONS.map((section) => (\n <div key={section.key} className=\"space-y-2\">\n <Label className=\"text-sm font-medium\">\n {section.label}\n {section.required && <span className=\"ml-0.5 text-destructive\">*</span>}\n </Label>\n <p className=\"text-xs text-muted-foreground\">{section.helper}</p>\n\n {section.type === \"textarea\" ? (\n <AutoTextarea\n value={fields[section.key] ?? \"\"}\n onChange={(v) => updateField(section.key, v)}\n disabled={updateAgent.isPending}\n placeholder={section.placeholder}\n ariaLabel={section.label}\n />\n ) : (\n <ConversationFlowEditor\n steps={conversationFlowSteps}\n onChange={setConversationFlowSteps}\n disabled={updateAgent.isPending}\n />\n )}\n </div>\n ))}\n\n {/* Character count + token estimate */}\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <span className=\"tabular-nums\">{chars.toLocaleString(\"pt-BR\")} caracteres</span>\n <span>·</span>\n <span className=\"tabular-nums\">~{tokens.toLocaleString(\"pt-BR\")} tokens</span>\n </div>\n\n {/* Sticky save/discard bar */}\n {hasChanges && (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-2 rounded-lg border bg-background p-3 shadow-sm\">\n <p className=\"text-sm text-muted-foreground\">Você tem alterações não salvas.</p>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={discard} disabled={updateAgent.isPending}>\n Descartar\n </Button>\n <Button size=\"sm\" onClick={handleSave} disabled={updateAgent.isPending}>\n {updateAgent.isPending && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Salvar\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport type { Agent, PromptVersion, ConversationFlowStep } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { usePromptVersions } from \"../../hooks\";\nimport {\n Button,\n Badge,\n Skeleton,\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { FileText, RotateCcw, X, AlertTriangle } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ninterface AgentRevisionTabProps {\n agent: Agent;\n config: GagentsHookConfig;\n}\n\nconst STRUCTURED_MARKERS = [\"[IDENTIDADE]\", \"[MISSÃO]\", \"[TOM, ESTILO & FORMATO]\"];\n\nfunction formatDate(dateStr: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(\"pt-BR\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction computeDiff(\n oldText: string,\n newText: string,\n): { type: \"added\" | \"removed\" | \"equal\"; line: string }[] {\n const oldLines = oldText.split(\"\\n\");\n const newLines = newText.split(\"\\n\");\n const result: { type: \"added\" | \"removed\" | \"equal\"; line: string }[] = [];\n const maxLen = Math.max(oldLines.length, newLines.length);\n\n for (let i = 0; i < maxLen; i++) {\n const oldLine = i < oldLines.length ? oldLines[i] : undefined;\n const newLine = i < newLines.length ? newLines[i] : undefined;\n\n if (oldLine === newLine) {\n result.push({ type: \"equal\", line: newLine! });\n } else {\n if (oldLine !== undefined) {\n result.push({ type: \"removed\", line: oldLine });\n }\n if (newLine !== undefined) {\n result.push({ type: \"added\", line: newLine });\n }\n }\n }\n\n return result;\n}\n\nfunction formatConversationFlow(raw: string | null): string {\n if (!raw) return \"\";\n try {\n const steps: ConversationFlowStep[] = JSON.parse(raw);\n if (!Array.isArray(steps) || steps.length === 0) return \"\";\n return steps\n .sort((a, b) => a.order - b.order)\n .map((s) => {\n let line = `${s.order}. ${s.instruction}`;\n if (s.example) line += `\\n Exemplo: ${s.example}`;\n return line;\n })\n .join(\"\\n\");\n } catch {\n // If it's not valid JSON, return raw text\n return raw;\n }\n}\n\nfunction buildAssembledPrompt(agent: Agent): string {\n const sections: string[] = [];\n\n if (agent.identity?.trim()) {\n sections.push(`[IDENTIDADE]\\n${agent.identity.trim()}`);\n }\n if (agent.mission?.trim()) {\n sections.push(`[MISSÃO]\\n${agent.mission.trim()}`);\n }\n if (agent.tone_style_format?.trim()) {\n sections.push(`[TOM, ESTILO & FORMATO]\\n${agent.tone_style_format.trim()}`);\n }\n if (agent.rules?.trim()) {\n sections.push(`[REGRAS]\\n${agent.rules.trim()}`);\n }\n\n const flowFormatted = formatConversationFlow(agent.conversation_flow);\n if (flowFormatted) {\n sections.push(`[FLUXO DE CONVERSA]\\n${flowFormatted}`);\n }\n\n if (agent.context?.trim()) {\n sections.push(`[CONTEXTO]\\n${agent.context.trim()}`);\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nfunction isLegacyVersion(version: PromptVersion): boolean {\n const content = version.prompt_content ?? \"\";\n return !STRUCTURED_MARKERS.some((marker) => content.includes(marker));\n}\n\nexport function AgentRevisionTab({ agent, config }: AgentRevisionTabProps) {\n const { data: versionsData, isLoading } = usePromptVersions(config, agent.id);\n\n const [compareVersionId, setCompareVersionId] = useState<number | null>(null);\n const [legacyModalVersion, setLegacyModalVersion] = useState<PromptVersion | null>(null);\n\n const versions = (versionsData?.data || []) as PromptVersion[];\n const sortedVersions = [...versions].sort(\n (a, b) => new Date(b.datetime_add).getTime() - new Date(a.datetime_add).getTime(),\n );\n const currentVersion = sortedVersions.find((v) => v.is_current) || sortedVersions[0] || null;\n\n const assembledPrompt = useMemo(() => buildAssembledPrompt(agent), [\n agent.identity,\n agent.mission,\n agent.tone_style_format,\n agent.rules,\n agent.conversation_flow,\n agent.context,\n ]);\n\n const charCount = assembledPrompt.length;\n const tokenEstimate = Math.ceil(charCount / 4);\n\n const compareVersion = sortedVersions.find((v) => v.id === compareVersionId);\n\n const diffLines =\n currentVersion && compareVersion && compareVersion.id !== currentVersion.id\n ? computeDiff(compareVersion.prompt_content ?? \"\", currentVersion.prompt_content ?? \"\")\n : null;\n\n function handleRestore(version: PromptVersion) {\n if (isLegacyVersion(version)) {\n setLegacyModalVersion(version);\n } else {\n toast.info(\"Restaurar versão estruturada — funcionalidade em desenvolvimento\");\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3 p-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-14 w-full\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4 p-4 lg:flex-row\">\n {/* Left: Preview + Diff */}\n <div className=\"min-w-0 flex-1 space-y-4\">\n {/* Assembled prompt preview */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n Preview do Prompt Montado\n </h3>\n <div className=\"rounded-lg border\">\n <pre className=\"max-h-[32rem] overflow-auto whitespace-pre-wrap p-4 font-mono text-sm leading-relaxed\">\n {assembledPrompt ? (\n assembledPrompt.split(\"\\n\").map((line, i) => {\n const isSectionHeader = /^\\[.+\\]$/.test(line.trim());\n return (\n <span\n key={i}\n className={isSectionHeader ? \"font-bold text-foreground\" : \"\"}\n >\n {line}\n {\"\\n\"}\n </span>\n );\n })\n ) : (\n <span className=\"italic text-muted-foreground\">\n Nenhum campo estruturado preenchido.\n </span>\n )}\n </pre>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <span className=\"tabular-nums\">{charCount.toLocaleString(\"pt-BR\")} caracteres</span>\n <span>·</span>\n <span className=\"tabular-nums\">~{tokenEstimate.toLocaleString(\"pt-BR\")} tokens</span>\n </div>\n </div>\n\n {/* Diff panel (conditional) */}\n {diffLines && compareVersion && currentVersion && (\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n Diferenças: v{compareVersion.version_number} → v{currentVersion.version_number} (actual)\n </h3>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setCompareVersionId(null)}\n className=\"text-xs\"\n >\n <X className=\"mr-1 h-3 w-3\" />\n Fechar\n </Button>\n </div>\n <div className=\"max-h-64 overflow-auto rounded-lg border font-mono text-sm\">\n {diffLines.map((line, i) => (\n <div\n key={i}\n className={`whitespace-pre-wrap px-3 py-0.5 ${\n line.type === \"added\"\n ? \"bg-green-500/10 text-green-700 dark:text-green-400\"\n : line.type === \"removed\"\n ? \"bg-red-500/10 text-red-700 dark:text-red-400\"\n : \"\"\n }`}\n >\n <span className=\"mr-2 inline-block w-4 select-none text-muted-foreground\">\n {line.type === \"added\" ? \"+\" : line.type === \"removed\" ? \"-\" : \" \"}\n </span>\n {line.line || \" \"}\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Right: Version history timeline */}\n <div className=\"w-full space-y-2 lg:w-80 lg:shrink-0\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n Histórico de Versões\n </h3>\n {sortedVersions.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <FileText className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma versão encontrada.\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {sortedVersions.map((version) => {\n const isCurrent = currentVersion?.id === version.id;\n const isComparing = version.id === compareVersionId;\n return (\n <div\n key={version.id}\n className={`rounded-lg border p-3 transition-colors ${\n isCurrent\n ? \"border-primary bg-primary/5\"\n : isComparing\n ? \"border-muted-foreground/30 bg-muted/50\"\n : \"\"\n }`}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-medium\">\n v{version.version_number}\n </span>\n {isCurrent && (\n <Badge variant=\"default\" className=\"text-[10px] px-1.5 py-0\">\n Actual\n </Badge>\n )}\n </div>\n <div className=\"mt-1 text-xs text-muted-foreground\">\n {formatDate(version.datetime_add)}\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{(version.prompt_content ?? \"\").length} chars</span>\n <span>·</span>\n <span className=\"truncate font-mono\">\n {(version.prompt_hash ?? \"\").slice(0, 8)}\n </span>\n </div>\n {version.change_notes && (\n <div className=\"mt-1.5 text-xs italic text-muted-foreground\">\n {version.change_notes}\n </div>\n )}\n {!isCurrent && (\n <div className=\"mt-2 flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => setCompareVersionId(isComparing ? null : version.id)}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground\"\n >\n <FileText aria-hidden=\"true\" className=\"h-3 w-3\" />\n {isComparing ? \"Ocultar diff\" : \"Comparar\"}\n </button>\n <button\n type=\"button\"\n onClick={() => handleRestore(version)}\n className=\"flex items-center gap-1 text-xs text-primary hover:underline\"\n >\n <RotateCcw aria-hidden=\"true\" className=\"h-3 w-3\" />\n Restaurar\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Legacy version modal */}\n <Dialog\n open={!!legacyModalVersion}\n onOpenChange={(open) => {\n if (!open) setLegacyModalVersion(null);\n }}\n >\n <DialogContent className=\"max-w-2xl\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <AlertTriangle className=\"h-5 w-5 text-amber-500\" />\n Versão Legada — v{legacyModalVersion?.version_number}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-3\">\n <div className=\"rounded-lg border border-amber-500/30 bg-amber-500/5 p-3\">\n <p className=\"text-sm text-amber-700 dark:text-amber-400\">\n Esta versão foi criada antes da reestruturação e não pode ser restaurada nos campos estruturados.\n </p>\n </div>\n <div className=\"max-h-96 overflow-auto rounded-lg border p-4\">\n <pre className=\"whitespace-pre-wrap font-mono text-sm leading-relaxed\">\n {legacyModalVersion?.prompt_content ?? \"\"}\n </pre>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-muted-foreground\">\n <span>\n {(legacyModalVersion?.prompt_content ?? \"\").length.toLocaleString(\"pt-BR\")} caracteres\n </span>\n {legacyModalVersion?.change_notes && (\n <>\n <span>·</span>\n <span className=\"italic\">{legacyModalVersion.change_notes}</span>\n </>\n )}\n </div>\n </div>\n <div className=\"flex justify-end pt-2\">\n <Button variant=\"outline\" onClick={() => setLegacyModalVersion(null)}>\n Fechar\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { Conversation } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Skeleton,\n Badge,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { MessageCircle, ExternalLink } from \"lucide-react\";\nimport { ConversationView } from \"./conversation-view\";\n\ninterface AgentConversationsTableProps {\n conversations: Conversation[];\n isLoading: boolean;\n contactsMap?: Map<number, string>;\n objectivesMap?: Map<number, string>;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nfunction formatRelativeDate(dateStr: string | null): string {\n if (!dateStr) return \"—\";\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMin = Math.floor(diffMs / 60000);\n if (diffMin < 1) return \"agora\";\n if (diffMin < 60) return `${diffMin}m atrás`;\n const diffHours = Math.floor(diffMin / 60);\n if (diffHours < 24) return `${diffHours}h atrás`;\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 30) return `${diffDays}d atrás`;\n return date.toLocaleDateString(\"pt-BR\");\n}\n\nexport function AgentConversationsTable({\n conversations,\n isLoading,\n contactsMap,\n objectivesMap,\n config,\n renderChatLink,\n}: AgentConversationsTableProps) {\n const [selectedId, setSelectedId] = useState<number | null>(null);\n\n if (isLoading) {\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full\" />\n ))}\n </div>\n );\n }\n\n if (conversations.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <MessageCircle className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma conversa encontrada.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>ID</TableHead>\n <TableHead>Contato</TableHead>\n <TableHead>Objetivo</TableHead>\n <TableHead className=\"text-right\">Mensagens</TableHead>\n <TableHead className=\"text-right\">Tokens</TableHead>\n <TableHead>Criado em</TableHead>\n <TableHead>Atualizado em</TableHead>\n <TableHead className=\"w-10\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {conversations.map((conversation) => (\n <TableRow\n key={conversation.id}\n className=\"cursor-pointer\"\n role=\"button\"\n tabIndex={0}\n onClick={() =>\n setSelectedId(\n selectedId === conversation.id ? null : conversation.id,\n )\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setSelectedId(\n selectedId === conversation.id ? null : conversation.id,\n );\n }\n }}\n data-state={selectedId === conversation.id ? \"selected\" : undefined}\n >\n <TableCell className=\"font-mono text-xs\">\n {conversation.id}\n </TableCell>\n <TableCell>\n {contactsMap?.get(conversation.id_contact) ?? conversation.id_contact}\n </TableCell>\n <TableCell>\n {conversation.id_objective && objectivesMap?.get(conversation.id_objective) ? (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {objectivesMap.get(conversation.id_objective)}\n </Badge>\n ) : (\n <span className=\"text-xs text-muted-foreground\">—</span>\n )}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">\n {conversation.message_count ?? \"—\"}\n </TableCell>\n <TableCell className=\"text-right tabular-nums\">\n {conversation.usage_tokens ?? \"—\"}\n </TableCell>\n <TableCell>\n {new Date(conversation.datetime_add).toLocaleDateString(\"pt-BR\")}\n </TableCell>\n <TableCell>\n {formatRelativeDate(conversation.datetime_alt)}\n </TableCell>\n <TableCell>\n {conversation.id_external ? (\n renderChatLink ? (\n <span onClick={(e) => e.stopPropagation()}>\n {renderChatLink(conversation.id_external)}\n </span>\n ) : (\n <a\n href={`/gchat/inbox/${conversation.id_external}`}\n title=\"Ver no Chat\"\n aria-label=\"Ver no Chat\"\n onClick={(e) => e.stopPropagation()}\n className=\"inline-flex items-center justify-center rounded-md p-1.5 text-muted-foreground hover:text-foreground hover:bg-accent transition-colors\"\n >\n <ExternalLink className=\"h-4 w-4\" />\n </a>\n )\n ) : null}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n\n {selectedId && (\n <ConversationView\n conversationId={selectedId}\n onClose={() => setSelectedId(null)}\n contactsMap={contactsMap}\n config={config}\n renderChatLink={renderChatLink}\n />\n )}\n </div>\n );\n}\n","import { useConversation } from \"../../hooks\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { Skeleton, Button } from \"@greatapps/greatauth-ui/ui\";\nimport { X, MessageSquare } from \"lucide-react\";\n\ninterface ConversationViewProps {\n conversationId: number;\n onClose: () => void;\n contactsMap?: Map<number, string>;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nfunction formatDateTime(dateStr: string | null): string {\n if (!dateStr) return \"—\";\n return new Date(dateStr).toLocaleString(\"pt-BR\");\n}\n\nexport function ConversationView({\n conversationId,\n onClose,\n contactsMap,\n config,\n renderChatLink,\n}: ConversationViewProps) {\n const { data: conversation, isLoading } = useConversation(config, conversationId);\n\n if (isLoading) {\n return (\n <div className=\"rounded-lg border bg-card p-4 space-y-3\">\n <Skeleton className=\"h-6 w-48\" />\n <div className=\"grid grid-cols-2 gap-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-10 w-full\" />\n ))}\n </div>\n </div>\n );\n }\n\n if (!conversation) {\n return (\n <div className=\"rounded-lg border bg-card p-4\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm text-muted-foreground\">\n Conversa não encontrada.\n </p>\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Fechar\" onClick={onClose}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-lg border bg-card p-4 space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold\">Detalhes da conversa #{conversation.id}</h3>\n <div className=\"flex items-center gap-1\">\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Fechar\" onClick={onClose}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n {conversation.id_external ? (\n renderChatLink ? (\n renderChatLink(conversation.id_external)\n ) : (\n <Button variant=\"outline\" size=\"sm\" asChild>\n <a href={`/gchat/inbox/${conversation.id_external}`}>\n <MessageSquare className=\"mr-2 h-4 w-4\" />\n Ver no Chat\n </a>\n </Button>\n )\n ) : null}\n\n <div className=\"grid grid-cols-2 gap-x-6 gap-y-3 text-sm\">\n <div>\n <span className=\"text-muted-foreground\">Thread ID</span>\n <p className=\"font-mono text-xs mt-0.5\">\n {conversation.openai_thread_id || \"—\"}\n </p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Contato</span>\n <p className=\"mt-0.5\">\n {contactsMap?.get(conversation.id_contact) ?? conversation.id_contact}\n </p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Agente</span>\n <p className=\"mt-0.5\">{conversation.id_agent ?? \"—\"}</p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Mensagens</span>\n <p className=\"mt-0.5\">{conversation.message_count ?? \"—\"}</p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Tokens</span>\n <p className=\"mt-0.5\">{conversation.usage_tokens ?? \"—\"}</p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Rotações de Thread</span>\n <p className=\"mt-0.5\">{conversation.rotation_count ?? \"—\"}</p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Criado em</span>\n <p className=\"mt-0.5\">\n {formatDateTime(conversation.datetime_add)}\n </p>\n </div>\n <div>\n <span className=\"text-muted-foreground\">Atualizado em</span>\n <p className=\"mt-0.5\">\n {formatDateTime(conversation.datetime_alt)}\n </p>\n </div>\n </div>\n </div>\n );\n}\n","import type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useAgentConversations, useGagentsContacts, useObjectives } from \"../../hooks\";\nimport { AgentConversationsTable } from \"./agent-conversations-table\";\n\ninterface AgentConversationsPanelProps {\n agent: Agent;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nexport function AgentConversationsPanel({\n agent,\n config,\n renderChatLink,\n}: AgentConversationsPanelProps) {\n const { data: conversationsData, isLoading } = useAgentConversations(\n config,\n agent.id,\n );\n const { data: contactsData } = useGagentsContacts(config);\n const { data: objectivesData } = useObjectives(config, agent.id);\n\n const conversations = conversationsData?.data || [];\n const contactsMap = new Map(\n (contactsData?.data || []).map((c) => [c.id, c.name]),\n );\n const objectivesMap = new Map(\n (objectivesData?.data || []).map((o) => [o.id, o.title]),\n );\n\n return (\n <div className=\"p-4\">\n <AgentConversationsTable\n conversations={conversations}\n isLoading={isLoading}\n contactsMap={contactsMap}\n objectivesMap={objectivesMap}\n config={config}\n renderChatLink={renderChatLink}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n useCapabilities,\n useAgentCapabilities,\n useUpdateAgentCapabilities,\n} from \"../../hooks\";\nimport type {\n CapabilityCategory,\n CapabilityModule,\n AgentCapability,\n AgentCapabilitiesPayload,\n} from \"../../types/capabilities\";\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n Switch,\n Checkbox,\n Badge,\n Button,\n Skeleton,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n CalendarCheck,\n Users,\n Settings,\n HeartHandshake,\n Package,\n ChevronDown,\n Loader2,\n Pencil,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { cn } from \"../../lib\";\n\n// ---------------------------------------------------------------------------\n// Operation label mapping (pt-BR) — NEW naming convention\n// ---------------------------------------------------------------------------\n\nconst OPERATION_LABELS: Record<string, string> = {\n list: \"Buscar\",\n view: \"Visualizar\",\n create: \"Criar\",\n update: \"Atualizar\",\n};\n\n/** Map old operation slug to new function name prefix */\nconst OPERATION_PREFIX: Record<string, string> = {\n list: \"search\",\n view: \"view\",\n create: \"create\",\n update: \"update\",\n};\n\nfunction getOperationLabel(slug: string): string {\n return OPERATION_LABELS[slug] ?? slug;\n}\n\n/** Build the new function slug: search_gclinic_{module}, create_gclinic_{module}, etc. */\nfunction getOperationFunctionSlug(opSlug: string, moduleSlug: string): string {\n const prefix = OPERATION_PREFIX[opSlug] ?? opSlug;\n return `${prefix}_gclinic_${moduleSlug}`;\n}\n\n/** Default instruction for an operation */\nfunction getDefaultInstruction(opSlug: string, moduleLabel: string): string {\n switch (opSlug) {\n case \"list\":\n return `Buscar ${moduleLabel.toLowerCase()} com filtros`;\n case \"view\":\n return `Visualizar detalhes de ${moduleLabel.toLowerCase()}`;\n case \"create\":\n return `Criar novo(a) ${moduleLabel.toLowerCase()}`;\n case \"update\":\n return `Atualizar ${moduleLabel.toLowerCase()} existente`;\n default:\n return `${getOperationLabel(opSlug)} ${moduleLabel.toLowerCase()}`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Category icon mapping\n// ---------------------------------------------------------------------------\n\nconst CATEGORY_ICONS: Record<string, React.ElementType> = {\n agenda: CalendarCheck,\n cadastros: Users,\n infraestrutura: Settings,\n relacionamentos: HeartHandshake,\n};\n\nfunction getCategoryIcon(slug: string): React.ElementType {\n return CATEGORY_ICONS[slug] ?? Package;\n}\n\n// ---------------------------------------------------------------------------\n// Internal state helpers\n// ---------------------------------------------------------------------------\n\n/** Map from module slug -> set of enabled operation slugs */\ntype CapabilityState = Map<string, Set<string>>;\n\n/** Map from module slug -> { operation slug -> instruction text } */\ntype InstructionsState = Map<string, Record<string, string>>;\n\nfunction buildStateFromAgent(agentCaps: AgentCapability[]): CapabilityState {\n const state: CapabilityState = new Map();\n for (const cap of agentCaps) {\n state.set(cap.module, new Set(cap.operations));\n }\n return state;\n}\n\nfunction buildInstructionsFromAgent(agentCaps: AgentCapability[]): InstructionsState {\n const state: InstructionsState = new Map();\n for (const cap of agentCaps) {\n if (cap.instructions) {\n state.set(cap.module, { ...cap.instructions });\n }\n }\n return state;\n}\n\nfunction stateToPayload(state: CapabilityState, instructions: InstructionsState): AgentCapabilitiesPayload {\n const capabilities: AgentCapability[] = [];\n state.forEach((ops, mod) => {\n if (ops.size > 0) {\n const modInstructions = instructions.get(mod);\n const cap: AgentCapability = { module: mod, operations: Array.from(ops) };\n if (modInstructions && Object.keys(modInstructions).length > 0) {\n cap.instructions = modInstructions;\n }\n capabilities.push(cap);\n }\n });\n return { capabilities };\n}\n\nfunction cloneState(state: CapabilityState): CapabilityState {\n const next: CapabilityState = new Map();\n state.forEach((ops, mod) => next.set(mod, new Set(ops)));\n return next;\n}\n\nfunction cloneInstructions(state: InstructionsState): InstructionsState {\n const next: InstructionsState = new Map();\n state.forEach((instr, mod) => next.set(mod, { ...instr }));\n return next;\n}\n\nfunction statesEqual(a: CapabilityState, b: CapabilityState): boolean {\n // Compare only modules that have operations (non-empty sets)\n const aEffective = new Map([...a].filter(([, ops]) => ops.size > 0));\n const bEffective = new Map([...b].filter(([, ops]) => ops.size > 0));\n\n if (aEffective.size !== bEffective.size) return false;\n for (const [mod, opsA] of aEffective) {\n const opsB = bEffective.get(mod);\n if (!opsB || opsA.size !== opsB.size) return false;\n for (const op of opsA) {\n if (!opsB.has(op)) return false;\n }\n }\n return true;\n}\n\nfunction instructionsEqual(a: InstructionsState, b: InstructionsState, activeModules: CapabilityState): boolean {\n // Only compare instructions for modules that are active in the current state.\n // Orphaned instructions (for disabled modules) are irrelevant.\n const relevantModules = new Set([...activeModules.keys()].filter(k => (activeModules.get(k)?.size ?? 0) > 0));\n\n for (const mod of relevantModules) {\n const instrA = a.get(mod) ?? {};\n const instrB = b.get(mod) ?? {};\n const keysA = Object.keys(instrA);\n const keysB = Object.keys(instrB);\n if (keysA.length !== keysB.length) return false;\n for (const k of keysA) {\n if (instrA[k] !== instrB[k]) return false;\n }\n }\n\n // Also check if server had instructions for modules that are now active but local doesn't\n for (const mod of relevantModules) {\n const instrA = a.get(mod);\n const instrB = b.get(mod);\n const hasA = instrA && Object.keys(instrA).length > 0;\n const hasB = instrB && Object.keys(instrB).length > 0;\n if (hasA !== hasB) return false;\n }\n\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface CapabilitiesTabProps {\n config: GagentsHookConfig;\n agentId: number;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function CapabilitiesTab({ config, agentId }: CapabilitiesTabProps) {\n const { data: registry, isLoading: isLoadingRegistry } = useCapabilities(config);\n const { data: agentCaps, isLoading: isLoadingAgent } = useAgentCapabilities(config, agentId);\n const updateMutation = useUpdateAgentCapabilities(config);\n\n // Local state for optimistic updates\n const [localState, setLocalState] = useState<CapabilityState>(new Map());\n const [serverState, setServerState] = useState<CapabilityState>(new Map());\n const [localInstructions, setLocalInstructions] = useState<InstructionsState>(new Map());\n const [serverInstructions, setServerInstructions] = useState<InstructionsState>(new Map());\n const [initialized, setInitialized] = useState(false);\n\n // Sync server data into local state on first load / refetch\n useEffect(() => {\n if (agentCaps && !initialized) {\n const state = buildStateFromAgent(agentCaps);\n const instr = buildInstructionsFromAgent(agentCaps);\n setLocalState(state);\n setServerState(cloneState(state));\n setLocalInstructions(instr);\n setServerInstructions(cloneInstructions(instr));\n setInitialized(true);\n }\n }, [agentCaps, initialized]);\n\n // Reset initialized when agentId changes\n useEffect(() => {\n setInitialized(false);\n }, [agentId]);\n\n const hasChanges = useMemo(\n () =>\n initialized &&\n (!statesEqual(localState, serverState) || !instructionsEqual(localInstructions, serverInstructions, localState)),\n [localState, serverState, localInstructions, serverInstructions, initialized],\n );\n\n // ------ State mutation helpers ------\n const updateState = useCallback(\n (updater: (prev: CapabilityState) => CapabilityState) => {\n setLocalState((prev) => updater(prev));\n },\n [],\n );\n\n const toggleModule = useCallback(\n (mod: CapabilityModule, enabled: boolean) => {\n updateState((prev) => {\n const next = cloneState(prev);\n if (enabled) {\n next.set(mod.slug, new Set(mod.operations));\n } else {\n next.delete(mod.slug);\n }\n return next;\n });\n },\n [updateState],\n );\n\n const toggleOperation = useCallback(\n (mod: CapabilityModule, opSlug: string, enabled: boolean) => {\n updateState((prev) => {\n const next = cloneState(prev);\n const ops = new Set(next.get(mod.slug) ?? []);\n if (enabled) {\n ops.add(opSlug);\n } else {\n ops.delete(opSlug);\n }\n if (ops.size > 0) {\n next.set(mod.slug, ops);\n } else {\n next.delete(mod.slug);\n }\n return next;\n });\n },\n [updateState],\n );\n\n const updateOperationInstruction = useCallback(\n (moduleSlug: string, opSlug: string, instruction: string) => {\n setLocalInstructions((prev) => {\n const next = cloneInstructions(prev);\n const modInstr = next.get(moduleSlug) ?? {};\n modInstr[opSlug] = instruction;\n next.set(moduleSlug, modInstr);\n return next;\n });\n },\n [],\n );\n\n const enableAll = useCallback(() => {\n if (!registry) return;\n updateState(() => {\n const next: CapabilityState = new Map();\n for (const cat of registry.categories) {\n for (const mod of cat.modules) {\n next.set(mod.slug, new Set(mod.operations));\n }\n }\n return next;\n });\n }, [registry, updateState]);\n\n const disableAll = useCallback(() => {\n updateState(() => new Map());\n }, [updateState]);\n\n const discard = useCallback(() => {\n setLocalState(cloneState(serverState));\n setLocalInstructions(cloneInstructions(serverInstructions));\n }, [serverState, serverInstructions]);\n\n const saveNow = useCallback(() => {\n const payload = stateToPayload(localState, localInstructions);\n updateMutation.mutate(\n { agentId, payload },\n {\n onSuccess: () => {\n setServerState(cloneState(localState));\n setServerInstructions(cloneInstructions(localInstructions));\n toast.success(\"Capacidades salvas\");\n },\n onError: () => {\n setLocalState(cloneState(serverState));\n setLocalInstructions(cloneInstructions(serverInstructions));\n toast.error(\"Erro ao salvar capacidades\");\n },\n },\n );\n }, [agentId, localState, localInstructions, serverState, serverInstructions, updateMutation]);\n\n // ------ Counting helpers ------\n function countActiveModules(cat: CapabilityCategory): number {\n return cat.modules.filter((m) => (localState.get(m.slug)?.size ?? 0) > 0).length;\n }\n\n // ------ Loading state ------\n if (isLoadingRegistry || isLoadingAgent) {\n return (\n <div className=\"space-y-3\">\n {[1, 2, 3, 4].map((i) => (\n <Skeleton key={i} className=\"h-14 w-full\" />\n ))}\n </div>\n );\n }\n\n // ------ Empty state ------\n if (!registry || !registry.categories.length) {\n return (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <Package className=\"h-12 w-12 text-muted-foreground mb-3\" />\n <h3 className=\"text-base font-medium\">Nenhuma capacidade disponível</h3>\n <p className=\"text-sm text-muted-foreground mt-1 max-w-sm\">\n Este produto ainda não possui capacidades registadas. As capacidades serão\n adicionadas automaticamente quando o produto for configurado.\n </p>\n </div>\n );\n }\n\n // ------ Render ------\n return (\n <div className=\"space-y-4\">\n {/* Header with global actions */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-medium\">Capacidades do agente</h3>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n Ative ou desative módulos e operações disponíveis para este agente.\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={enableAll}>\n Ativar tudo\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={disableAll}>\n Desativar tudo\n </Button>\n </div>\n </div>\n\n {/* Category accordions */}\n <Accordion type=\"multiple\" className=\"space-y-2\">\n {registry.categories.map((cat) => {\n const Icon = getCategoryIcon(cat.slug);\n const activeCount = countActiveModules(cat);\n const totalModules = cat.modules.length;\n\n return (\n <AccordionItem\n key={cat.slug}\n value={cat.slug}\n className=\"border rounded-lg px-4\"\n >\n <AccordionTrigger className=\"hover:no-underline py-3\">\n <div className=\"flex items-center gap-3 flex-1\">\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-medium text-sm\">{cat.label}</span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {activeCount} de {totalModules} módulos ativos\n </Badge>\n </div>\n </AccordionTrigger>\n <AccordionContent className=\"pb-3 !h-auto\">\n <div className=\"space-y-1\">\n {cat.modules.map((mod) => {\n const enabledOps = localState.get(mod.slug);\n const isModuleOn = (enabledOps?.size ?? 0) > 0;\n const allOpsEnabled =\n enabledOps?.size === mod.operations.length;\n const modInstructions = localInstructions.get(mod.slug) ?? {};\n\n return (\n <ModuleRow\n key={mod.slug}\n module={mod}\n isOn={isModuleOn}\n allOpsEnabled={allOpsEnabled}\n enabledOps={enabledOps ?? new Set()}\n instructions={modInstructions}\n onToggleModule={(on) => toggleModule(mod, on)}\n onToggleOperation={(op, on) =>\n toggleOperation(mod, op, on)\n }\n onUpdateInstruction={(op, instr) =>\n updateOperationInstruction(mod.slug, op, instr)\n }\n />\n );\n })}\n </div>\n </AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n\n {/* Save bar */}\n {hasChanges && (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-2 rounded-lg border bg-background p-3 shadow-sm\">\n <p className=\"text-sm text-muted-foreground\">Você tem alterações não salvas.</p>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={discard} disabled={updateMutation.isPending}>\n Descartar\n </Button>\n <Button size=\"sm\" onClick={saveNow} disabled={updateMutation.isPending}>\n {updateMutation.isPending && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Salvar\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ModuleRow sub-component\n// ---------------------------------------------------------------------------\n\ninterface ModuleRowProps {\n module: CapabilityModule;\n isOn: boolean;\n allOpsEnabled: boolean;\n enabledOps: Set<string>;\n instructions: Record<string, string>;\n onToggleModule: (on: boolean) => void;\n onToggleOperation: (op: string, on: boolean) => void;\n onUpdateInstruction: (op: string, instruction: string) => void;\n}\n\nfunction ModuleRow({\n module: mod,\n isOn,\n enabledOps,\n instructions,\n onToggleModule,\n onToggleOperation,\n onUpdateInstruction,\n}: ModuleRowProps) {\n const [expanded, setExpanded] = useState(false);\n // Track which operation's instruction editor is open\n const [editingOp, setEditingOp] = useState<string | null>(null);\n\n return (\n <div className=\"rounded-md border px-3 py-2\">\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2 flex-1 text-left\"\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n aria-label={`Expandir ${mod.label}`}\n >\n <ChevronDown\n className={`h-3.5 w-3.5 text-muted-foreground transition-transform ${\n expanded ? \"rotate-0\" : \"-rotate-90\"\n }`}\n />\n <span className=\"text-sm font-medium\">{mod.label}</span>\n {mod.description && (\n <span className=\"text-xs text-muted-foreground hidden sm:inline\">\n — {mod.description}\n </span>\n )}\n {isOn && (\n <Badge variant=\"secondary\" className=\"text-xs ml-1\">\n {enabledOps.size}/{mod.operations.length}\n </Badge>\n )}\n </button>\n <Switch\n checked={isOn}\n onCheckedChange={onToggleModule}\n aria-label={`Ativar módulo ${mod.label}`}\n />\n </div>\n\n {expanded && (\n <div className=\"mt-2 ml-6 space-y-1.5 pb-1\">\n {mod.operations.map((op) => {\n const checked = enabledOps.has(op);\n const fnSlug = getOperationFunctionSlug(op, mod.slug);\n const isEditing = editingOp === op;\n const currentInstruction = instructions[op] ?? getDefaultInstruction(op, mod.label);\n\n return (\n <div key={op} className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5\">\n <Checkbox\n checked={checked}\n onCheckedChange={(val) =>\n onToggleOperation(op, val === true)\n }\n aria-label={`${getOperationLabel(op)} em ${mod.label}`}\n />\n <span className={cn(\"text-sm\", checked ? \"\" : \"text-muted-foreground\")}>\n {getOperationLabel(op)}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n ({fnSlug})\n </span>\n <button\n type=\"button\"\n className=\"p-0.5 rounded hover:bg-muted/50 transition-colors ml-auto\"\n onClick={() => setEditingOp(isEditing ? null : op)}\n aria-label={`Editar instruções de ${getOperationLabel(op)}`}\n >\n <Pencil className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n </div>\n\n {/* Inline instruction editor */}\n {isEditing && (\n <div className=\"ml-5\">\n <textarea\n className=\"w-full rounded-md border bg-background px-3 py-2 text-sm resize-y min-h-[56px] focus:outline-none focus:ring-1 focus:ring-ring\"\n value={currentInstruction}\n onChange={(e) => onUpdateInstruction(op, e.target.value)}\n placeholder=\"Instruções personalizadas para esta operação...\"\n rows={2}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useState, useEffect, useMemo } from \"react\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useIntegrationState } from \"../../hooks/use-integrations\";\nimport { useAgentTools, useAddAgentTool, useRemoveAgentTool, useUpdateAgentTool } from \"../../hooks/use-agent-tools\";\nimport { useCreateTool, useTools } from \"../../hooks/use-tools\";\nimport { Switch, Tooltip, TooltipContent, TooltipTrigger, Checkbox, Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plug, Loader2, ChevronDown, Pencil } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { CalendarSync } from \"lucide-react\";\nimport { cn } from \"../../lib\";\nimport type { IntegrationCardData } from \"../../hooks/use-integrations\";\nimport type { Tool } from \"../../types\";\n\n// ---------------------------------------------------------------------------\n// Icon mapping\n// ---------------------------------------------------------------------------\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n CalendarSync,\n Plug,\n};\n\nfunction resolveIcon(name: string): LucideIcon {\n return ICON_MAP[name] ?? Plug;\n}\n\n// ---------------------------------------------------------------------------\n// Integration functions registry\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationFunction {\n slug: string;\n label: string;\n description: string;\n defaultInstructions: string;\n}\n\nconst INTEGRATION_FUNCTIONS: Record<string, IntegrationFunction[]> = {\n \"google-calendar\": [\n { slug: \"search_google_calendar_events\", label: \"Buscar Eventos\", description: \"Listar eventos do calendário\", defaultInstructions: \"Buscar eventos no Google Calendar do usuário\" },\n { slug: \"create_google_calendar_event\", label: \"Criar Evento\", description: \"Criar novo evento no calendário\", defaultInstructions: \"Criar novo evento no Google Calendar\" },\n { slug: \"update_google_calendar_event\", label: \"Atualizar Evento\", description: \"Editar evento existente\", defaultInstructions: \"Atualizar evento existente no Google Calendar\" },\n { slug: \"delete_google_calendar_event\", label: \"Remover Evento\", description: \"Cancelar/remover evento\", defaultInstructions: \"Remover evento do Google Calendar\" },\n ],\n};\n\n// ---------------------------------------------------------------------------\n// Build custom_instructions from selected functions\n// ---------------------------------------------------------------------------\n\nfunction buildCustomInstructions(\n integrationSlug: string,\n integrationName: string,\n selectedFunctions: Set<string>,\n functionInstructions: Record<string, string>,\n): string {\n const fns = INTEGRATION_FUNCTIONS[integrationSlug];\n if (!fns) return \"\";\n\n const activeFns = fns.filter((f) => selectedFunctions.has(f.slug));\n if (activeFns.length === 0) return \"\";\n\n const lines: string[] = [];\n lines.push(`## ${integrationName} (${integrationSlug})`);\n\n for (const f of activeFns) {\n const instruction = functionInstructions[f.slug] || f.defaultInstructions;\n lines.push(`### ${f.slug}`);\n lines.push(instruction);\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationsTabProps {\n config: GagentsHookConfig;\n agentId: number;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n// Local state types\ninterface IntegrationLocalState {\n enabled: boolean;\n selectedFunctions: Set<string>;\n functionInstructions: Record<string, string>;\n}\n\nexport function IntegrationsTab({\n config,\n agentId,\n}: IntegrationsTabProps) {\n const { cards, isLoading } = useIntegrationState(config, agentId);\n const { data: agentToolsData, isLoading: agentToolsLoading } = useAgentTools(config, agentId);\n const { data: toolsData } = useTools(config);\n const addAgentTool = useAddAgentTool(config);\n const removeAgentTool = useRemoveAgentTool(config);\n const updateAgentTool = useUpdateAgentTool(config);\n const createTool = useCreateTool(config);\n\n const agentTools = agentToolsData?.data ?? [];\n const allTools = toolsData?.data ?? [];\n\n // Local state: integrationSlug -> state\n const [localState, setLocalState] = useState<Record<string, IntegrationLocalState>>({});\n const [serverState, setServerState] = useState<Record<string, IntegrationLocalState>>({});\n const [initialized, setInitialized] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [editingFunction, setEditingFunction] = useState<string | null>(null);\n const [expandedCards, setExpandedCards] = useState<Set<string>>(new Set());\n\n // Only show connected credentials (account-level)\n const connectedCards = cards.filter(\n (c) => !c.isAddNew && (c.state === \"connected\" || c.state === \"expired\"),\n );\n\n // Initialize state from server data\n useEffect(() => {\n if (!connectedCards.length || initialized) return;\n\n const state: Record<string, IntegrationLocalState> = {};\n for (const card of connectedCards) {\n const slug = card.definition.slug;\n const isLinked = card.linkedToAgent;\n const fns = INTEGRATION_FUNCTIONS[slug] ?? [];\n\n if (isLinked) {\n // Parse existing custom_instructions to restore function selections\n const toolId = card.tool?.id;\n const agentTool = toolId ? agentTools.find((at) => at.id_tool === toolId) : null;\n const existingInstructions = agentTool?.custom_instructions || \"\";\n\n const selectedFns = new Set<string>();\n const fnInstr: Record<string, string> = {};\n for (const fn of fns) {\n if (!existingInstructions || existingInstructions.includes(fn.slug)) {\n selectedFns.add(fn.slug);\n }\n // Extract instruction from custom_instructions if present\n const match = existingInstructions.match(new RegExp(`- ${fn.slug}: (.+)`));\n fnInstr[fn.slug] = match?.[1] ?? fn.defaultInstructions;\n }\n\n state[slug] = { enabled: true, selectedFunctions: selectedFns, functionInstructions: fnInstr };\n } else {\n state[slug] = {\n enabled: false,\n selectedFunctions: new Set(fns.map((f) => f.slug)),\n functionInstructions: Object.fromEntries(fns.map((f) => [f.slug, f.defaultInstructions])),\n };\n }\n }\n\n setLocalState(state);\n setServerState(JSON.parse(JSON.stringify(state, (_k, v) => v instanceof Set ? [...v] : v)));\n setInitialized(true);\n }, [connectedCards, agentTools, initialized]);\n\n // Detect changes\n const hasChanges = useMemo(() => {\n if (!initialized) return false;\n const localKeys = Object.keys(localState);\n for (const slug of localKeys) {\n const local = localState[slug];\n const server = serverState[slug];\n if (!server) return true;\n if (local.enabled !== server.enabled) return true;\n const serverFns = server.selectedFunctions instanceof Set ? server.selectedFunctions : new Set(server.selectedFunctions as unknown as string[]);\n if (local.selectedFunctions.size !== serverFns.size) return true;\n for (const fn of local.selectedFunctions) {\n if (!serverFns.has(fn)) return true;\n }\n // Check instructions for selected functions\n for (const fn of local.selectedFunctions) {\n if ((local.functionInstructions[fn] ?? '') !== (server.functionInstructions[fn] ?? '')) return true;\n }\n }\n return false;\n }, [localState, serverState, initialized]);\n\n // Toggle integration on/off (local only)\n const handleToggle = useCallback(\n (card: IntegrationCardData, checked: boolean) => {\n const slug = card.definition.slug;\n setLocalState((prev) => ({\n ...prev,\n [slug]: {\n ...prev[slug],\n enabled: checked,\n },\n }));\n if (checked) {\n setExpandedCards((prev) => new Set([...prev, slug]));\n }\n },\n [],\n );\n\n // Toggle function checkbox (local only)\n const handleToggleFunction = useCallback(\n (slug: string, fnSlug: string, checked: boolean) => {\n setLocalState((prev) => {\n const current = prev[slug];\n if (!current) return prev;\n const fns = new Set(current.selectedFunctions);\n if (checked) fns.add(fnSlug); else fns.delete(fnSlug);\n return { ...prev, [slug]: { ...current, selectedFunctions: fns } };\n });\n },\n [],\n );\n\n // Update function instruction (local only)\n const handleUpdateInstruction = useCallback(\n (slug: string, fnSlug: string, instruction: string) => {\n setLocalState((prev) => {\n const current = prev[slug];\n if (!current) return prev;\n return {\n ...prev,\n [slug]: {\n ...current,\n functionInstructions: { ...current.functionInstructions, [fnSlug]: instruction },\n },\n };\n });\n },\n [],\n );\n\n // Save all changes\n const saveNow = useCallback(async () => {\n setIsSaving(true);\n try {\n for (const slug of Object.keys(localState)) {\n const local = localState[slug];\n const card = connectedCards.find((c) => c.definition.slug === slug);\n if (!card) continue;\n\n const serverEntry = serverState[slug];\n const wasEnabled = serverEntry?.enabled ?? false;\n\n if (local.enabled && !wasEnabled) {\n // Activate: create tool if needed, then add agent_tool\n let toolId = card.tool?.id;\n if (!toolId) {\n const existingTool = allTools.find((t) => t.slug === slug);\n if (existingTool) {\n toolId = existingTool.id;\n } else {\n const result = await createTool.mutateAsync({\n name: card.definition.name, slug, type: \"integration\", description: card.definition.description,\n });\n const d = result?.data;\n toolId = (Array.isArray(d) ? d[0]?.id : (d as Tool | undefined)?.id) ?? undefined;\n if (!toolId) continue;\n }\n }\n const customInstructions = buildCustomInstructions(slug, card.definition.name, local.selectedFunctions, local.functionInstructions);\n await addAgentTool.mutateAsync({\n idAgent: agentId,\n body: { id_tool: toolId, enabled: true, ...(customInstructions ? { custom_instructions: customInstructions } : {}) },\n });\n } else if (!local.enabled && wasEnabled) {\n // Deactivate: remove agent_tool\n const toolId = card.tool?.id;\n if (toolId) {\n const agentTool = agentTools.find((at) => at.id_tool === toolId);\n if (agentTool) {\n await removeAgentTool.mutateAsync({ idAgent: agentId, id: agentTool.id });\n }\n }\n } else if (local.enabled && wasEnabled) {\n // Update: functions or instructions changed\n const toolId = card.tool?.id;\n if (toolId) {\n const agentTool = agentTools.find((at) => at.id_tool === toolId);\n if (agentTool) {\n const customInstructions = buildCustomInstructions(slug, card.definition.name, local.selectedFunctions, local.functionInstructions);\n await updateAgentTool.mutateAsync({\n idAgent: agentId, id: agentTool.id,\n body: { custom_instructions: customInstructions },\n });\n }\n }\n }\n }\n // Sync server state\n setServerState(JSON.parse(JSON.stringify(localState, (_k, v) => v instanceof Set ? [...v] : v)));\n toast.success(\"Integrações salvas\");\n } catch {\n toast.error(\"Erro ao salvar integrações\");\n } finally {\n setIsSaving(false);\n }\n }, [localState, serverState, connectedCards, allTools, agentTools, agentId, addAgentTool, removeAgentTool, updateAgentTool, createTool]);\n\n const discard = useCallback(() => {\n const restored: Record<string, IntegrationLocalState> = {};\n for (const [slug, entry] of Object.entries(serverState)) {\n restored[slug] = {\n ...entry,\n selectedFunctions: entry.selectedFunctions instanceof Set ? entry.selectedFunctions : new Set(entry.selectedFunctions as unknown as string[]),\n };\n }\n setLocalState(restored);\n }, [serverState]);\n\n // Loading state\n if (isLoading || agentToolsLoading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n // Empty state — no integrations connected at account level\n if (connectedCards.length === 0) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-3 py-16 text-muted-foreground\">\n <Plug className=\"h-10 w-10\" />\n <p className=\"text-sm font-medium\">Nenhuma integração conectada</p>\n <p className=\"text-xs text-center max-w-sm\">\n Conecte integrações na página de Integrações da conta para que possam\n ser ativadas neste agente.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <p className=\"text-xs text-muted-foreground\">\n Ative ou desative as integrações conectadas na conta para este agente.\n </p>\n\n <div className=\"grid grid-cols-1 gap-3\">\n {connectedCards.map((card) => {\n const Icon = resolveIcon(card.definition.icon);\n const integrationSlug = card.definition.slug;\n const local = localState[integrationSlug];\n const isLinked = local?.enabled ?? false;\n const fns = INTEGRATION_FUNCTIONS[integrationSlug];\n const isExpanded = expandedCards.has(integrationSlug);\n const selected = local?.selectedFunctions ?? new Set();\n const instructions = local?.functionInstructions ?? {};\n\n return (\n <div\n key={`${integrationSlug}-cred-${card.credentialId}`}\n className={cn(\n \"rounded-xl border bg-card transition-shadow\",\n isLinked ? \"border-primary/30 shadow-sm\" : \"opacity-75\",\n )}\n >\n {/* Header */}\n <div className=\"flex items-center gap-3 p-4\">\n {/* Icon */}\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"h-4.5 w-4.5\" />\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"text-sm font-medium leading-tight truncate\">\n {card.definition.name}\n </h4>\n {card.accountLabel && (\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"text-xs text-muted-foreground truncate\" title={card.accountLabel}>\n {card.accountLabel}\n </p>\n </TooltipTrigger>\n <TooltipContent>{card.accountLabel}</TooltipContent>\n </Tooltip>\n )}\n {card.state === \"expired\" && (\n <p className=\"text-xs text-amber-600 dark:text-amber-400\">Expirado</p>\n )}\n </div>\n\n {/* Expand toggle (only when linked and has functions) */}\n {isLinked && fns && (\n <button\n type=\"button\"\n className=\"p-1 rounded hover:bg-muted/50 transition-colors\"\n onClick={() =>\n setExpandedCards((prev) => {\n const next = new Set(prev);\n if (next.has(integrationSlug)) {\n next.delete(integrationSlug);\n } else {\n next.add(integrationSlug);\n }\n return next;\n })\n }\n aria-label=\"Expandir funções\"\n >\n <ChevronDown\n className={cn(\n \"h-4 w-4 text-muted-foreground transition-transform\",\n isExpanded ? \"rotate-0\" : \"-rotate-90\",\n )}\n />\n </button>\n )}\n\n {/* Toggle */}\n <Switch\n checked={isLinked}\n disabled={isSaving}\n onCheckedChange={(checked) => handleToggle(card, checked)}\n aria-label={`${isLinked ? \"Desativar\" : \"Ativar\"} ${card.definition.name} para este agente`}\n />\n </div>\n\n {/* Expandable function list */}\n {isLinked && fns && isExpanded && (\n <div className=\"border-t px-4 py-3 space-y-2\">\n <p className=\"text-xs text-muted-foreground mb-2\">\n Selecione as funções disponíveis para o agente:\n </p>\n {fns.map((fn) => {\n const isSelected = selected.has(fn.slug);\n const isEditing = editingFunction === `${integrationSlug}:${fn.slug}`;\n const currentInstruction = instructions[fn.slug] ?? fn.defaultInstructions;\n\n return (\n <div key={fn.slug} className=\"space-y-1\">\n <div className=\"flex items-center gap-2\">\n <Checkbox\n checked={isSelected}\n onCheckedChange={(val) =>\n handleToggleFunction(integrationSlug, fn.slug, val === true)\n }\n aria-label={fn.label}\n />\n <div className=\"flex-1 min-w-0\">\n <span className={cn(\"text-sm\", isSelected ? \"\" : \"text-muted-foreground\")}>\n {fn.label}\n </span>\n <span className=\"text-xs text-muted-foreground ml-1.5\">\n ({fn.slug})\n </span>\n </div>\n <button\n type=\"button\"\n className=\"p-1 rounded hover:bg-muted/50 transition-colors\"\n onClick={() =>\n setEditingFunction(\n isEditing ? null : `${integrationSlug}:${fn.slug}`,\n )\n }\n aria-label={`Editar instruções de ${fn.label}`}\n >\n <Pencil className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n </div>\n\n {/* Inline instruction editor */}\n {isEditing && (\n <div className=\"ml-6\">\n <textarea\n className=\"w-full rounded-md border bg-background px-3 py-2 text-sm resize-y min-h-[60px] focus:outline-none focus:ring-1 focus:ring-ring\"\n value={currentInstruction}\n onChange={(e) =>\n handleUpdateInstruction(integrationSlug, fn.slug, e.target.value)\n }\n placeholder=\"Instruções personalizadas para esta função...\"\n rows={2}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Save bar */}\n {hasChanges && (\n <div className=\"sticky bottom-0 z-10 flex items-center justify-between gap-2 rounded-lg border bg-background p-3 shadow-sm\">\n <p className=\"text-sm text-muted-foreground\">Você tem alterações não salvas.</p>\n <div className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={discard} disabled={isSaving}>\n Descartar\n </Button>\n <Button size=\"sm\" onClick={saveNow} disabled={isSaving}>\n {isSaving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Salvar\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { AgentObjectivesList } from \"./agent-objectives-list\";\nimport { AgentDefinitionEditor } from \"./agent-definition-editor\";\nimport { AgentRevisionTab } from \"./agent-revision-tab\";\nimport { AgentConversationsPanel } from \"../conversations/agent-conversations-panel\";\nimport { CapabilitiesTab } from \"../capabilities/capabilities-tab\";\nimport { IntegrationsTab } from \"../capabilities/integrations-tab\";\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Target, Settings2, MessageCircle, Blocks, Plug, History } from \"lucide-react\";\n\ninterface AgentTabsProps {\n agent: Agent;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nexport function AgentTabs({\n agent,\n config,\n renderChatLink,\n}: AgentTabsProps) {\n return (\n <Tabs defaultValue=\"definicao\">\n <TabsList>\n <TabsTrigger value=\"definicao\" className=\"flex items-center gap-1.5\">\n <Settings2 aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Definição\n </TabsTrigger>\n <TabsTrigger value=\"objetivos\" className=\"flex items-center gap-1.5\">\n <Target aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Objetivos\n </TabsTrigger>\n <TabsTrigger value=\"capacidades\" className=\"flex items-center gap-1.5\">\n <Blocks aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Capacidades\n </TabsTrigger>\n <TabsTrigger value=\"integracoes\" className=\"flex items-center gap-1.5\">\n <Plug aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Integrações\n </TabsTrigger>\n <TabsTrigger value=\"conversas\" className=\"flex items-center gap-1.5\">\n <MessageCircle aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Conversas\n </TabsTrigger>\n <TabsTrigger value=\"revisao\" className=\"flex items-center gap-1.5\">\n <History aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Revisão\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"definicao\" className=\"mt-4\">\n <AgentDefinitionEditor agent={agent} config={config} />\n </TabsContent>\n\n <TabsContent value=\"objetivos\" className=\"mt-4\">\n <AgentObjectivesList agent={agent} config={config} />\n </TabsContent>\n\n <TabsContent value=\"capacidades\" className=\"mt-4\">\n <CapabilitiesTab config={config} agentId={agent.id} />\n </TabsContent>\n\n <TabsContent value=\"integracoes\" className=\"mt-4\">\n <IntegrationsTab config={config} agentId={agent.id} />\n </TabsContent>\n\n <TabsContent value=\"conversas\" className=\"mt-4\">\n <AgentConversationsPanel\n agent={agent}\n config={config}\n renderChatLink={renderChatLink}\n />\n </TabsContent>\n\n <TabsContent value=\"revisao\" className=\"mt-4\">\n <AgentRevisionTab agent={agent} config={config} />\n </TabsContent>\n </Tabs>\n );\n}\n","import { useState } from \"react\";\nimport type { Agent, AgentTool, Tool, ToolCredential } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n useAgentTools,\n useAddAgentTool,\n useRemoveAgentTool,\n useUpdateAgentTool,\n} from \"../../hooks\";\nimport { useTools } from \"../../hooks\";\nimport { useToolCredentials } from \"../../hooks\";\nimport {\n Switch,\n Badge,\n Button,\n Skeleton,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Input,\n Textarea,\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetFooter,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n Trash2,\n Plus,\n Wrench,\n Settings2,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ninterface AgentToolsListProps {\n agent: Agent;\n config: GagentsHookConfig;\n}\n\nexport function AgentToolsList({ agent, config }: AgentToolsListProps) {\n const { data: agentToolsData, isLoading } = useAgentTools(config, agent.id);\n const { data: allToolsData } = useTools(config);\n const addMutation = useAddAgentTool(config);\n const removeMutation = useRemoveAgentTool(config);\n const updateMutation = useUpdateAgentTool(config);\n\n const [removeTarget, setRemoveTarget] = useState<AgentTool | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [configTarget, setConfigTarget] = useState<AgentTool | null>(null);\n const [configInstructions, setConfigInstructions] = useState(\"\");\n const [configCredentialId, setConfigCredentialId] = useState<string>(\"\");\n\n const { data: credentialsData } = useToolCredentials(config);\n const allCredentials: ToolCredential[] = credentialsData?.data || [];\n\n const agentTools = agentToolsData?.data || [];\n const allTools = (allToolsData?.data || []).filter((t: Tool) => !t.slug?.startsWith(\"gclinic_\"));\n const assignedToolIds = new Set(agentTools.map((at) => at.id_tool));\n // Filter out internal gclinic_* tools from assigned tools display\n const visibleAgentTools = agentTools.filter((at) => {\n const tool = allTools.find((t: Tool) => t.id === at.id_tool);\n return !tool || !tool.slug?.startsWith(\"gclinic_\");\n });\n const availableTools = allTools.filter((t: Tool) => !assignedToolIds.has(t.id));\n const filteredAvailable = availableTools.filter((t: Tool) =>\n t.name.toLowerCase().includes(search.toLowerCase()),\n );\n\n function getToolInfo(idTool: number): Tool | undefined {\n return allTools.find((t) => t.id === idTool);\n }\n\n async function handleToggleEnabled(agentTool: AgentTool, checked: boolean) {\n try {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: agentTool.id,\n body: { enabled: checked },\n });\n toast.success(checked ? \"Ferramenta ativada\" : \"Ferramenta desativada\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao alterar estado da ferramenta\",\n );\n }\n }\n\n async function handleAdd(tool: Tool) {\n try {\n await addMutation.mutateAsync({\n idAgent: agent.id,\n body: { id_tool: tool.id },\n });\n toast.success(\"Ferramenta adicionada\");\n setAddOpen(false);\n setSearch(\"\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao adicionar ferramenta\",\n );\n }\n }\n\n async function handleRemove() {\n if (!removeTarget) return;\n try {\n await removeMutation.mutateAsync({\n idAgent: agent.id,\n id: removeTarget.id,\n });\n toast.success(\"Ferramenta removida\");\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao remover ferramenta\",\n );\n } finally {\n setRemoveTarget(null);\n }\n }\n\n function openConfig(agentTool: AgentTool) {\n setConfigTarget(agentTool);\n setConfigInstructions(agentTool.custom_instructions || \"\");\n setConfigCredentialId(agentTool.id_tool_credential ? String(agentTool.id_tool_credential) : \"\");\n }\n\n async function handleSaveConfig() {\n if (!configTarget) return;\n try {\n const newCredentialId = configCredentialId ? parseInt(configCredentialId, 10) : null;\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: configTarget.id,\n body: {\n custom_instructions: configInstructions.trim() || null,\n id_tool_credential: newCredentialId,\n },\n });\n toast.success(\"Configuração atualizada\");\n setConfigTarget(null);\n } catch (err) {\n toast.error(\n err instanceof Error ? err.message : \"Erro ao atualizar configuração\",\n );\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3 p-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-14 w-full\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-muted-foreground\">\n {visibleAgentTools.length} ferramenta{visibleAgentTools.length !== 1 ? \"s\" : \"\"} associada{visibleAgentTools.length !== 1 ? \"s\" : \"\"}\n </h3>\n <Popover open={addOpen} onOpenChange={setAddOpen}>\n <PopoverTrigger asChild>\n <Button size=\"sm\" disabled={availableTools.length === 0}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Adicionar Ferramenta\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-72 p-0\" align=\"end\">\n <div className=\"p-2\">\n <Input\n placeholder=\"Buscar ferramenta\\u2026\"\n aria-label=\"Buscar ferramenta\"\n name=\"search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"h-8\"\n />\n </div>\n <div className=\"max-h-48 overflow-y-auto\">\n {filteredAvailable.length === 0 ? (\n <p className=\"p-3 text-center text-sm text-muted-foreground\">\n Nenhuma ferramenta disponível\n </p>\n ) : (\n filteredAvailable.map((tool) => (\n <button\n key={tool.id}\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-2 text-left text-sm hover:bg-accent\"\n onClick={() => handleAdd(tool)}\n disabled={addMutation.isPending}\n >\n <Wrench className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"flex-1 font-medium\">{tool.name}</span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {tool.type}\n </Badge>\n </button>\n ))\n )}\n </div>\n </PopoverContent>\n </Popover>\n </div>\n\n {visibleAgentTools.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed p-8 text-center\">\n <Wrench className=\"mb-2 h-8 w-8 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma ferramenta associada. Clique em 'Adicionar Ferramenta' para começar.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {visibleAgentTools.map((agentTool) => {\n const tool = getToolInfo(agentTool.id_tool);\n return (\n <div\n key={agentTool.id}\n className=\"flex items-center gap-3 rounded-lg border bg-card p-3\"\n >\n <div className=\"flex flex-1 flex-col gap-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate font-medium\">\n {tool?.name || `Ferramenta #${agentTool.id_tool}`}\n </span>\n {tool?.type && (\n <Badge variant=\"secondary\" className=\"shrink-0 text-xs\">\n {tool.type}\n </Badge>\n )}\n </div>\n {agentTool.custom_instructions && (\n <p className=\"truncate text-xs text-muted-foreground\">\n {agentTool.custom_instructions}\n </p>\n )}\n </div>\n\n <Switch\n aria-label=\"Ativar/Desativar\"\n checked={agentTool.enabled}\n onCheckedChange={(checked) =>\n handleToggleEnabled(agentTool, checked)\n }\n disabled={updateMutation.isPending}\n />\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Configurar\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => openConfig(agentTool)}\n title=\"Configurar instruções\"\n >\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Remover\"\n className=\"shrink-0 text-muted-foreground hover:text-destructive\"\n onClick={() => setRemoveTarget(agentTool)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Config sheet for custom_instructions */}\n <Sheet\n open={!!configTarget}\n onOpenChange={(open) => !open && setConfigTarget(null)}\n >\n <SheetContent className=\"sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>\n Instruções da Ferramenta\n </SheetTitle>\n </SheetHeader>\n <div className=\"flex-1 overflow-y-auto px-4 space-y-4\">\n {configTarget && getToolInfo(configTarget.id_tool)?.type !== \"none\" && (\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-credential\">Credencial</Label>\n <Select\n value={configCredentialId || undefined}\n onValueChange={(val) => setConfigCredentialId(val === \"__none__\" ? \"\" : val)}\n >\n <SelectTrigger id=\"tool-credential\">\n <SelectValue placeholder=\"Selecione uma credencial (opcional)\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__none__\">Nenhuma (automático)</SelectItem>\n {allCredentials\n .filter((c) => configTarget && c.id_tool === configTarget.id_tool && c.status === \"active\")\n .map((c) => (\n <SelectItem key={c.id} value={String(c.id)}>\n {c.label || `Credencial #${c.id}`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-muted-foreground\">\n Vincule uma credencial específica a esta ferramenta neste agente.\n </p>\n </div>\n )}\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-instructions\">Instruções Personalizadas</Label>\n <Textarea\n id=\"tool-instructions\"\n name=\"instructions\"\n value={configInstructions}\n onChange={(e) => setConfigInstructions(e.target.value)}\n placeholder=\"Instru\\u00e7\\u00f5es sobre como e quando o agente deve usar esta ferramenta\\u2026\"\n rows={6}\n />\n <p className=\"text-xs text-muted-foreground\">\n Este texto é adicionado ao prompt do agente para orientar o uso da ferramenta.\n </p>\n </div>\n </div>\n <SheetFooter className=\"flex-row justify-end border-t\">\n <Button\n variant=\"outline\"\n onClick={() => setConfigTarget(null)}\n >\n Cancelar\n </Button>\n <Button\n onClick={handleSaveConfig}\n disabled={updateMutation.isPending}\n >\n Salvar\n </Button>\n </SheetFooter>\n </SheetContent>\n </Sheet>\n\n {/* Remove confirmation */}\n <AlertDialog\n open={!!removeTarget}\n onOpenChange={(open) => !open && setRemoveTarget(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remover ferramenta?</AlertDialogTitle>\n <AlertDialogDescription>\n A ferramenta será desassociada deste agente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleRemove}\n disabled={removeMutation.isPending}\n >\n Remover\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { useTools, useDeleteTool } from \"../../hooks\";\nimport type { Tool } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { DataTable } from \"@greatapps/greatauth-ui\";\nimport {\n Input,\n Badge,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Pencil, Trash2, Search } from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\ninterface ToolsTableProps {\n onEdit: (tool: Tool) => void;\n config: GagentsHookConfig;\n}\n\nfunction useColumns(\n onEdit: (tool: Tool) => void,\n onDelete: (id: number) => void,\n): ColumnDef<Tool>[] {\n return [\n {\n accessorKey: \"name\",\n header: \"Nome\",\n cell: ({ row }) => (\n <span className=\"font-medium\">{row.original.name}</span>\n ),\n sortingFn: (rowA, rowB) =>\n rowA.original.name\n .toLowerCase()\n .localeCompare(rowB.original.name.toLowerCase()),\n },\n {\n accessorKey: \"slug\",\n header: \"Slug\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm font-mono\">\n {row.original.slug || \"\\u2014\"}\n </span>\n ),\n },\n {\n accessorKey: \"type\",\n header: \"Tipo\",\n cell: ({ row }) => (\n <Badge variant=\"secondary\">{row.original.type}</Badge>\n ),\n },\n {\n accessorKey: \"description\",\n header: \"Descrição\",\n cell: ({ row }) => {\n const desc = row.original.description;\n if (!desc) return <span className=\"text-muted-foreground text-sm\">{\"\\u2014\"}</span>;\n return (\n <span className=\"text-muted-foreground text-sm\">\n {desc.length > 50 ? `${desc.slice(0, 50)}\\u2026` : desc}\n </span>\n );\n },\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {format(new Date(row.original.datetime_add), \"dd/MM/yyyy\", {\n locale: ptBR,\n })}\n </span>\n ),\n },\n {\n id: \"actions\",\n size: 80,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label=\"Editar\"\n onClick={() => onEdit(row.original)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Editar</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n aria-label=\"Excluir\"\n onClick={() => onDelete(row.original.id)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Excluir</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport function ToolsTable({ onEdit, config }: ToolsTableProps) {\n const [search, setSearch] = useState(\"\");\n const [page, setPage] = useState(1);\n\n const queryParams = useMemo(() => {\n const params: Record<string, string> = {\n limit: \"15\",\n page: String(page),\n };\n if (search) {\n params.search = search;\n }\n return params;\n }, [search, page]);\n\n const { data, isLoading } = useTools(config, queryParams);\n const deleteTool = useDeleteTool(config);\n const [deleteId, setDeleteId] = useState<number | null>(null);\n\n const rawTools = data?.data || [];\n const tools = rawTools.filter((t: Tool) => !t.slug?.startsWith(\"gclinic_\"));\n const total = tools.length;\n\n const columns = useColumns(\n (tool) => onEdit(tool),\n (id) => setDeleteId(id),\n );\n\n function handleDelete() {\n if (!deleteId) return;\n deleteTool.mutate(deleteId, {\n onSuccess: () => {\n toast.success(\"Ferramenta excluída\");\n setDeleteId(null);\n },\n onError: () => toast.error(\"Erro ao excluir ferramenta\"),\n });\n }\n\n function handleSearchChange(value: string) {\n setSearch(value);\n setPage(1);\n }\n\n return (\n <>\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search aria-hidden=\"true\" className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar ferramentas\\u2026\"\n aria-label=\"Buscar ferramentas\"\n name=\"search\"\n autoComplete=\"off\"\n value={search}\n onChange={(e) => handleSearchChange(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={tools}\n isLoading={isLoading}\n emptyMessage=\"Nenhuma ferramenta encontrada\"\n total={total}\n page={page}\n onPageChange={setPage}\n pageSize={15}\n />\n\n {/* Delete confirmation */}\n <AlertDialog\n open={!!deleteId}\n onOpenChange={(open) => !open && setDeleteId(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Excluir ferramenta?</AlertDialogTitle>\n <AlertDialogDescription>\n Esta ação não pode ser desfeita. A ferramenta será removida\n permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel variant=\"outline\" size=\"default\">\n Cancelar\n </AlertDialogCancel>\n <AlertDialogAction\n variant=\"default\"\n size=\"default\"\n onClick={handleDelete}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Excluir\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","import { useState } from \"react\";\nimport { useCreateTool, useUpdateTool } from \"../../hooks\";\nimport type { Tool } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n SheetFooter,\n Button,\n Input,\n Textarea,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nconst TOOL_AUTH_TYPES = [\n { value: \"none\", label: \"Nenhuma\" },\n { value: \"api_key\", label: \"API Key\" },\n { value: \"oauth2\", label: \"OAuth 2.0\" },\n] as const;\n\ninterface ToolFormDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n tool?: Tool;\n config: GagentsHookConfig;\n}\n\ninterface FormState {\n name: string;\n slug: string;\n type: string;\n description: string;\n functionDefinitions: string;\n nameError: boolean;\n slugError: boolean;\n typeError: boolean;\n jsonError: boolean;\n}\n\nfunction toolToFormState(tool?: Tool): FormState {\n return {\n name: tool?.name || \"\",\n slug: tool?.slug || \"\",\n type: tool?.type || \"none\",\n description: tool?.description || \"\",\n functionDefinitions: tool?.function_definitions\n ? formatJson(tool.function_definitions)\n : \"\",\n nameError: false,\n slugError: false,\n typeError: false,\n jsonError: false,\n };\n}\n\nfunction formatJson(str: string): string {\n try {\n return JSON.stringify(JSON.parse(str), null, 2);\n } catch {\n return str;\n }\n}\n\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction isValidJson(str: string): boolean {\n if (!str.trim()) return true;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function ToolFormDialog({\n open,\n onOpenChange,\n tool,\n config,\n}: ToolFormDialogProps) {\n const isEditing = !!tool;\n const createTool = useCreateTool(config);\n const updateTool = useUpdateTool(config);\n const [form, setForm] = useState<FormState>(() => toolToFormState(tool));\n const [slugManuallyEdited, setSlugManuallyEdited] = useState(false);\n\n // Reset form when dialog opens or tool changes\n const [lastResetKey, setLastResetKey] = useState(\n () => `${tool?.id}-${open}`,\n );\n const resetKey = `${tool?.id}-${open}`;\n if (resetKey !== lastResetKey) {\n setLastResetKey(resetKey);\n setForm(toolToFormState(open ? tool : undefined));\n setSlugManuallyEdited(false);\n }\n\n const isPending = createTool.isPending || updateTool.isPending;\n\n async function handleSubmit(e: React.FormEvent) {\n e.preventDefault();\n\n let hasError = false;\n\n if (!form.name.trim()) {\n setForm((prev) => ({ ...prev, nameError: true }));\n hasError = true;\n }\n const effectiveSlug = form.slug.trim() || slugify(form.name);\n if (!effectiveSlug) {\n setForm((prev) => ({ ...prev, slugError: true }));\n hasError = true;\n }\n if (!form.type) {\n setForm((prev) => ({ ...prev, typeError: true }));\n hasError = true;\n }\n if (!isValidJson(form.functionDefinitions)) {\n setForm((prev) => ({ ...prev, jsonError: true }));\n hasError = true;\n }\n\n if (hasError) return;\n\n const body: Record<string, unknown> = {\n name: form.name.trim(),\n slug: effectiveSlug,\n type: form.type,\n };\n\n if (form.description.trim()) body.description = form.description.trim();\n else body.description = \"\";\n\n // JSONB critical rule: function_definitions must be sent as string\n if (form.functionDefinitions.trim()) {\n const parsed = JSON.parse(form.functionDefinitions.trim());\n body.function_definitions = JSON.stringify(parsed);\n } else {\n body.function_definitions = \"\";\n }\n\n try {\n if (isEditing) {\n await updateTool.mutateAsync({ id: tool.id, body });\n toast.success(\"Ferramenta atualizada\");\n } else {\n await createTool.mutateAsync(\n body as { name: string; slug: string; type: string; description?: string; function_definitions?: string },\n );\n toast.success(\"Ferramenta criada\");\n }\n onOpenChange(false);\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : isEditing ? \"Erro ao atualizar ferramenta\" : \"Erro ao criar ferramenta\",\n );\n }\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"sm:max-w-lg\">\n <SheetHeader>\n <SheetTitle>\n {isEditing ? \"Editar Ferramenta\" : \"Nova Ferramenta\"}\n </SheetTitle>\n </SheetHeader>\n <form onSubmit={handleSubmit} className=\"flex flex-1 flex-col overflow-hidden\">\n <div className=\"flex-1 overflow-y-auto px-4 space-y-4\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-name\">Nome *</Label>\n <Input\n id=\"tool-name\"\n name=\"name\"\n value={form.name}\n onChange={(e) => {\n const name = e.target.value;\n setForm((prev) => ({\n ...prev,\n name,\n nameError: name.trim() ? false : prev.nameError,\n ...(!slugManuallyEdited && !isEditing\n ? { slug: slugify(name), slugError: false }\n : {}),\n }));\n }}\n placeholder=\"Ex: Google Calendar\"\n disabled={isPending}\n />\n {form.nameError && (\n <p className=\"text-sm text-destructive\">Nome é obrigatório</p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-slug\">Slug (identificador único) *</Label>\n <Input\n id=\"tool-slug\"\n name=\"slug\"\n value={form.slug}\n onChange={(e) => {\n setSlugManuallyEdited(true);\n setForm((prev) => ({\n ...prev,\n slug: e.target.value,\n slugError: e.target.value.trim() ? false : prev.slugError,\n }));\n }}\n placeholder=\"Ex: google-calendar\"\n disabled={isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Gerado automaticamente a partir do nome. Usado internamente para identificar a ferramenta.\n </p>\n {form.slugError && (\n <p className=\"text-sm text-destructive\">Slug é obrigatório</p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-type\">Tipo de Autenticação *</Label>\n <Select\n value={form.type}\n onValueChange={(value) => {\n setForm((prev) => ({\n ...prev,\n type: value,\n typeError: false,\n }));\n }}\n disabled={isPending}\n >\n <SelectTrigger id=\"tool-type\">\n <SelectValue placeholder=\"Selecione o tipo\" />\n </SelectTrigger>\n <SelectContent>\n {TOOL_AUTH_TYPES.map((t) => (\n <SelectItem key={t.value} value={t.value}>\n {t.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-xs text-muted-foreground\">\n Define se a ferramenta requer credenciais para funcionar.\n </p>\n {form.typeError && (\n <p className=\"text-sm text-destructive\">Tipo é obrigatório</p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-description\">Descrição</Label>\n <Textarea\n id=\"tool-description\"\n name=\"description\"\n value={form.description}\n onChange={(e) =>\n setForm((prev) => ({ ...prev, description: e.target.value }))\n }\n placeholder=\"Descri\\u00e7\\u00e3o da ferramenta\\u2026\"\n rows={3}\n disabled={isPending}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tool-function-defs\">\n Definições de Função (JSON)\n </Label>\n <Textarea\n id=\"tool-function-defs\"\n name=\"functionDefs\"\n value={form.functionDefinitions}\n onChange={(e) => {\n setForm((prev) => ({\n ...prev,\n functionDefinitions: e.target.value,\n jsonError: false,\n }));\n }}\n placeholder={`[\n {\n \"type\": \"function\",\n \"function\": {\n \"name\": \"nome_da_funcao\",\n \"description\": \"O que a fun\\u00e7\\u00e3o faz\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": { \\u2026 },\n \"required\": [\\u2026]\n }\n }\n }\n]`}\n rows={10}\n className=\"font-mono text-sm\"\n disabled={isPending}\n />\n <p className=\"text-xs text-muted-foreground\">\n Array de definições no formato OpenAI Function Calling.\n </p>\n {form.jsonError && (\n <p className=\"text-sm text-destructive\">JSON inválido</p>\n )}\n </div>\n </div>\n\n <SheetFooter className=\"flex-row justify-end border-t\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={isPending}\n >\n Cancelar\n </Button>\n <Button type=\"submit\" disabled={isPending}>\n {isPending ? (\n <Loader2 aria-hidden=\"true\" className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : null}\n {isEditing ? \"Salvar\" : \"Criar\"}\n </Button>\n </SheetFooter>\n </form>\n </SheetContent>\n </Sheet>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport type { Tool, ToolCredential } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport {\n useDeleteToolCredential,\n} from \"../../hooks\";\nimport { useTools } from \"../../hooks\";\nimport { DataTable } from \"@greatapps/greatauth-ui\";\nimport {\n Input,\n Button,\n Badge,\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Trash2, Search } from \"lucide-react\";\nimport { format } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\nimport { toast } from \"sonner\";\n\ninterface ToolCredentialsFormProps {\n credentials: ToolCredential[];\n isLoading: boolean;\n config: GagentsHookConfig;\n gagentsApiUrl: string;\n}\n\nfunction formatDate(dateStr: string | null): string {\n if (!dateStr) return \"Sem expiração\";\n return format(new Date(dateStr), \"dd/MM/yyyy\", { locale: ptBR });\n}\n\nfunction useColumns(\n tools: Tool[],\n onRemove: (cred: ToolCredential) => void,\n): ColumnDef<ToolCredential>[] {\n function getToolName(idTool: number | null): string {\n if (!idTool) return \"\\u2014\";\n const tool = tools.find((t) => t.id === idTool);\n return tool?.name || `Ferramenta #${idTool}`;\n }\n\n return [\n {\n accessorKey: \"label\",\n header: \"Label\",\n cell: ({ row }) => (\n <span className=\"font-medium\">{row.original.label || \"\\u2014\"}</span>\n ),\n },\n {\n accessorKey: \"id_tool\",\n header: \"Ferramenta\",\n cell: ({ row }) => (\n <span className=\"text-sm\">{getToolName(row.original.id_tool)}</span>\n ),\n },\n {\n accessorKey: \"status\",\n header: \"Status\",\n cell: ({ row }) => (\n <Badge\n variant={row.original.status === \"active\" ? \"default\" : \"destructive\"}\n >\n {row.original.status === \"active\" ? \"Ativo\" : \"Expirado\"}\n </Badge>\n ),\n },\n {\n accessorKey: \"expires_at\",\n header: \"Expira em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {formatDate(row.original.expires_at)}\n </span>\n ),\n },\n {\n accessorKey: \"datetime_add\",\n header: \"Criado em\",\n cell: ({ row }) => (\n <span className=\"text-muted-foreground text-sm\">\n {formatDate(row.original.datetime_add)}\n </span>\n ),\n },\n {\n id: \"actions\",\n header: \"Ações\",\n size: 100,\n enableSorting: false,\n cell: ({ row }) => (\n <div className=\"flex items-center gap-1\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n aria-label=\"Excluir\"\n onClick={() => onRemove(row.original)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </div>\n ),\n },\n ];\n}\n\nexport function ToolCredentialsForm({\n credentials,\n isLoading,\n config,\n gagentsApiUrl,\n}: ToolCredentialsFormProps) {\n const deleteMutation = useDeleteToolCredential(config);\n const { data: toolsData } = useTools(config);\n const tools: Tool[] = (toolsData?.data || []).filter((t: Tool) => !t.slug?.startsWith(\"gclinic_\"));\n\n const [search, setSearch] = useState(\"\");\n const [removeTarget, setRemoveTarget] = useState<ToolCredential | null>(null);\n\n // Build a set of internal tool IDs to exclude from credentials display\n const internalToolIds = useMemo(() => {\n const allRawTools: Tool[] = toolsData?.data || [];\n return new Set(\n allRawTools\n .filter((t: Tool) => t.slug?.startsWith(\"gclinic_\"))\n .map((t: Tool) => t.id),\n );\n }, [toolsData]);\n\n const filteredCredentials = useMemo(() => {\n // Exclude credentials linked to internal gclinic_* tools\n const visible = credentials.filter(\n (cred) => !cred.id_tool || !internalToolIds.has(cred.id_tool),\n );\n if (!search) return visible;\n const term = search.toLowerCase();\n return visible.filter((cred) => {\n const toolName = tools.find((t) => t.id === cred.id_tool)?.name || \"\";\n return (\n (cred.label || \"\").toLowerCase().includes(term) ||\n toolName.toLowerCase().includes(term)\n );\n });\n }, [credentials, search, tools, internalToolIds]);\n\n const columns = useColumns(\n tools,\n (cred) => setRemoveTarget(cred),\n );\n\n async function handleRemove() {\n if (!removeTarget) return;\n try {\n const result = await deleteMutation.mutateAsync(removeTarget.id);\n if (result.status === 1) {\n toast.success(\"Credencial removida\");\n } else {\n toast.error(result.message || \"Erro ao remover credencial\");\n }\n } catch {\n toast.error(\"Erro ao remover credencial\");\n } finally {\n setRemoveTarget(null);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"relative flex-1 max-w-md\">\n <Search aria-hidden=\"true\" className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Buscar credenciais\\u2026\"\n aria-label=\"Buscar credenciais\"\n name=\"search\"\n autoComplete=\"off\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <DataTable\n columns={columns}\n data={filteredCredentials}\n isLoading={isLoading}\n emptyMessage=\"Nenhuma credencial encontrada\"\n />\n\n {/* Delete confirmation */}\n <AlertDialog\n open={!!removeTarget}\n onOpenChange={(open) => !open && setRemoveTarget(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remover credencial?</AlertDialogTitle>\n <AlertDialogDescription>\n A credencial será removida permanentemente.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={handleRemove}\n disabled={deleteMutation.isPending}\n >\n Remover\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from \"react\";\nimport type { IntegrationCardData, IntegrationCardState } from \"../../hooks/use-integrations\";\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@greatapps/greatauth-ui/ui\";\nimport {\n CalendarSync,\n Plug,\n Settings,\n RefreshCw,\n Clock,\n Plus,\n MoreVertical,\n Unplug,\n Trash2,\n} from \"lucide-react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { cn } from \"../../lib\";\n\n// ---------------------------------------------------------------------------\n// Icon mapping — extend as new integrations are added\n// ---------------------------------------------------------------------------\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n CalendarSync,\n Plug,\n Settings,\n RefreshCw,\n Clock,\n Plus,\n};\n\nfunction resolveIcon(name: string): LucideIcon {\n return ICON_MAP[name] ?? Plug;\n}\n\n// ---------------------------------------------------------------------------\n// Badge helpers\n// ---------------------------------------------------------------------------\n\ninterface BadgeVariant {\n label: string;\n className: string;\n}\n\nconst STATE_BADGES: Record<IntegrationCardState, BadgeVariant> = {\n available: {\n label: \"Disponível\",\n className: \"bg-muted text-muted-foreground\",\n },\n connected: {\n label: \"Conectado\",\n className: \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400\",\n },\n expired: {\n label: \"Expirado\",\n className: \"bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400\",\n },\n coming_soon: {\n label: \"Em breve\",\n className: \"bg-muted text-muted-foreground\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationCardProps {\n card: IntegrationCardData;\n onConnect: (card: IntegrationCardData) => void;\n onReconnect?: (card: IntegrationCardData) => void;\n onDisconnect?: (card: IntegrationCardData) => void;\n onDelete?: (card: IntegrationCardData) => void;\n}\n\nexport function IntegrationCard({\n card,\n onConnect,\n onReconnect,\n onDisconnect,\n onDelete,\n}: IntegrationCardProps) {\n const { definition, state, isAddNew, accountLabel } = card;\n const Icon = resolveIcon(definition.icon);\n const isComingSoon = state === \"coming_soon\";\n const isConnected = state === \"connected\" || state === \"expired\";\n\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n\n // \"Add new\" card — clean outline style with single \"Conectar\" button\n if (isAddNew) {\n return (\n <div\n className={cn(\n \"group relative flex flex-col gap-3 rounded-xl border bg-card/50 p-5 transition-all\",\n \"hover:shadow-md hover:bg-card cursor-pointer\",\n )}\n role=\"button\"\n tabIndex={0}\n aria-label={`Conectar ${definition.name}`}\n onClick={() => onConnect(card)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onConnect(card);\n }\n }}\n >\n {/* Header row */}\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/5 text-primary/60\">\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"flex-1 min-w-0 space-y-0.5\">\n <h3 className=\"text-sm font-semibold leading-tight text-foreground\">\n {definition.name}\n </h3>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Conectar nova conta\n </p>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"mt-auto flex items-center justify-end pt-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onConnect(card);\n }}\n >\n Conectar\n </Button>\n </div>\n </div>\n );\n }\n\n // Coming soon card\n if (isComingSoon) {\n const badge = STATE_BADGES[state];\n return (\n <div\n className=\"group relative flex flex-col gap-3 rounded-xl border bg-card p-5 opacity-60 cursor-default\"\n aria-disabled\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"h-5 w-5\" />\n </div>\n <Badge variant=\"outline\" className={cn(\"text-xs\", badge.className)}>\n {badge.label}\n </Badge>\n </div>\n <div className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold leading-tight\">{definition.name}</h3>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {definition.description}\n </p>\n </div>\n </div>\n );\n }\n\n // Connected / expired card\n const badge = STATE_BADGES[state];\n\n return (\n <>\n <div\n className=\"group relative flex flex-col gap-3 rounded-xl border bg-card p-5 transition-shadow hover:shadow-md\"\n >\n {/* Header row */}\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-start gap-3 min-w-0 flex-1\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary\">\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"flex-1 min-w-0 space-y-0.5\">\n <h3 className=\"text-sm font-semibold leading-tight\">{definition.name}</h3>\n {accountLabel && (\n <p className=\"text-xs text-muted-foreground leading-relaxed truncate\" title={accountLabel}>\n {accountLabel}\n </p>\n )}\n </div>\n </div>\n <Badge variant=\"outline\" className={cn(\"text-xs shrink-0\", badge.className)}>\n {badge.label}\n </Badge>\n </div>\n\n {/* Footer with \"Configurar\" dropdown */}\n <div className=\"mt-auto flex items-center justify-end gap-2 pt-1\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"text-xs gap-1.5\"\n >\n <Settings className=\"h-3.5 w-3.5\" />\n Configurar\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n onClick={() => onReconnect?.(card)}\n className=\"gap-2\"\n >\n <RefreshCw className=\"h-4 w-4\" />\n Reconectar\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => onDisconnect?.(card)}\n className=\"gap-2\"\n >\n <Unplug className=\"h-4 w-4\" />\n Desconectar\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => setDeleteDialogOpen(true)}\n className=\"gap-2 text-destructive focus:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4\" />\n Remover\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n\n {/* Delete confirmation dialog */}\n <AlertDialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Remover integração?</AlertDialogTitle>\n <AlertDialogDescription>\n Esta ação vai remover a credencial\n {accountLabel ? ` (${accountLabel})` : \"\"} de {definition.name}.\n Esta ação não pode ser desfeita.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancelar</AlertDialogCancel>\n <AlertDialogAction\n onClick={() => {\n onDelete?.(card);\n setDeleteDialogOpen(false);\n }}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n Remover\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </>\n );\n}\n","'use client';\n\nimport { useState } from \"react\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { ToolsTable } from \"../tools/tools-table\";\nimport { ToolFormDialog } from \"../tools/tool-form-dialog\";\nimport type { Tool } from \"../../types\";\nimport { Info } from \"lucide-react\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface AdvancedTabProps {\n config: GagentsHookConfig;\n agentId: number;\n gagentsApiUrl: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AdvancedTab({ config, agentId, gagentsApiUrl }: AdvancedTabProps) {\n const [editingTool, setEditingTool] = useState<Tool | null>(null);\n const [showToolForm, setShowToolForm] = useState(false);\n\n function handleEditTool(tool: Tool) {\n setEditingTool(tool);\n setShowToolForm(true);\n }\n\n function handleToolFormOpenChange(open: boolean) {\n setShowToolForm(open);\n if (!open) setEditingTool(null);\n }\n\n return (\n <div className=\"space-y-8\">\n {/* Info banner */}\n <div className=\"flex items-start gap-3 rounded-lg border border-blue-200 bg-blue-50 p-4 dark:border-blue-900 dark:bg-blue-950/30\">\n <Info className=\"mt-0.5 h-4 w-4 shrink-0 text-blue-600 dark:text-blue-400\" />\n <p className=\"text-sm text-blue-800 dark:text-blue-300\">\n Use as abas <strong>Capacidades</strong> e <strong>Integrações</strong> para\n configuração simplificada. Esta aba oferece controlo manual avançado sobre\n ferramentas. As credenciais são geridas dentro de cada ferramenta.\n </p>\n </div>\n\n {/* Ferramentas section */}\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-medium\">Ferramentas</h3>\n <ToolsTable onEdit={handleEditTool} config={config} />\n </section>\n\n {/* Tool edit dialog */}\n <ToolFormDialog\n open={showToolForm}\n onOpenChange={handleToolFormOpenChange}\n tool={editingTool ?? undefined}\n config={config}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Button,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Loader2, ChevronLeft, ChevronRight, Check } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport type { IntegrationDefinition } from \"../../data/integrations-registry\";\nimport type {\n WizardIntegrationMeta,\n OAuthResult,\n OAuthStatus,\n WizardStep,\n} from \"./types\";\nimport { InfoStep } from \"./wizard-steps/info-step\";\nimport { CredentialsStep } from \"./wizard-steps/credentials-step\";\nimport { ConfigStep, type ConfigOption } from \"./wizard-steps/config-step\";\nimport { ConfirmStep } from \"./wizard-steps/confirm-step\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst STEPS: WizardStep[] = [\"info\", \"credentials\", \"config\", \"confirm\"];\n\nconst STEP_LABELS: Record<WizardStep, string> = {\n info: \"Informação\",\n credentials: \"Credenciais\",\n config: \"Configuração\",\n confirm: \"Confirmação\",\n};\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationWizardProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Base integration definition from registry */\n integration: IntegrationDefinition;\n /** Wizard-specific metadata (capabilities, requirements, etc.) */\n meta: WizardIntegrationMeta;\n agentId: string | number;\n config: GagentsHookConfig;\n onComplete: () => void;\n /** gagents-r3-api base URL (used to build OAuth URLs) */\n gagentsApiUrl: string;\n /**\n * Existing credential ID -- when set, the wizard opens in edit mode\n * (step 2 shows \"Reconectar\" and step 3 is pre-filled).\n */\n existingCredentialId?: number;\n /**\n * Callback to load config options after OAuth completes.\n * e.g. load Google Calendar list. Returns ConfigOption[].\n */\n loadConfigOptions?: (credentialId: number) => Promise<ConfigOption[]>;\n /**\n * Existing config value to pre-fill the config step in edit/reconnect mode.\n */\n existingConfigValue?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function IntegrationWizard({\n open,\n onOpenChange,\n integration,\n meta,\n agentId: _agentId,\n config,\n onComplete,\n gagentsApiUrl,\n existingCredentialId,\n loadConfigOptions,\n existingConfigValue,\n}: IntegrationWizardProps) {\n const isReconnect = !!existingCredentialId;\n\n // Step navigation\n const [currentStep, setCurrentStep] = useState<WizardStep>(\"info\");\n const currentIndex = STEPS.indexOf(currentStep);\n\n // OAuth state\n const [oauthStatus, setOauthStatus] = useState<OAuthStatus>(\"idle\");\n const [oauthResult, setOauthResult] = useState<OAuthResult | null>(null);\n const popupRef = useRef<Window | null>(null);\n const popupPollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // API Key state\n const [apiKey, setApiKey] = useState(\"\");\n\n // Config state\n const [configOptions, setConfigOptions] = useState<ConfigOption[]>([]);\n const [configLoading, setConfigLoading] = useState(false);\n const [selectedConfigValue, setSelectedConfigValue] = useState(\"\");\n\n // Confirm state\n const [enableOnComplete, setEnableOnComplete] = useState(true);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n // Clean up popup poll interval on unmount\n useEffect(() => {\n return () => {\n if (popupPollRef.current) {\n clearInterval(popupPollRef.current);\n }\n };\n }, []);\n\n // Reset state when dialog opens/closes\n useEffect(() => {\n if (open) {\n setCurrentStep(\"info\");\n setOauthStatus(\"idle\");\n setOauthResult(null);\n setApiKey(\"\");\n setConfigOptions([]);\n setConfigLoading(false);\n setSelectedConfigValue(existingConfigValue ?? \"\");\n setEnableOnComplete(true);\n setIsSubmitting(false);\n } else {\n // Close any lingering popup\n if (popupRef.current && !popupRef.current.closed) {\n popupRef.current.close();\n }\n // Clear popup poll interval\n if (popupPollRef.current) {\n clearInterval(popupPollRef.current);\n popupPollRef.current = null;\n }\n }\n }, [open]);\n\n // -----------------------------------------------------------------------\n // OAuth popup message listener\n // -----------------------------------------------------------------------\n\n const handleOAuthMessage = useCallback(\n (event: MessageEvent) => {\n // Validate origin against gagents API URL\n try {\n if (event.origin !== new URL(gagentsApiUrl).origin) return;\n } catch {\n return;\n }\n\n // Only accept messages from our popup -- check for known data shape\n if (!event.data || typeof event.data !== \"object\") return;\n const msg = event.data as {\n type?: string;\n success?: boolean;\n email?: string;\n error?: string;\n credentialId?: number;\n };\n\n if (msg.type !== \"oauth-callback\") return;\n\n if (msg.success) {\n setOauthStatus(\"success\");\n setOauthResult({\n success: true,\n email: msg.email,\n credentialId: msg.credentialId,\n });\n\n // Auto-load config options if available\n const credId = msg.credentialId || existingCredentialId;\n if (credId && loadConfigOptions && meta.hasConfigStep) {\n setConfigLoading(true);\n loadConfigOptions(credId)\n .then((opts) => {\n setConfigOptions(opts);\n if (opts.length === 1) {\n setSelectedConfigValue(opts[0].id);\n }\n })\n .catch(() => setConfigOptions([]))\n .finally(() => setConfigLoading(false));\n }\n\n // Auto-advance to next step after a brief delay\n setTimeout(() => {\n setCurrentStep(meta.hasConfigStep ? \"config\" : \"confirm\");\n }, 1200);\n } else {\n setOauthStatus(\"error\");\n setOauthResult({\n success: false,\n error: msg.error || \"Falha na autorização\",\n });\n }\n },\n [gagentsApiUrl, existingCredentialId, meta.hasConfigStep, loadConfigOptions],\n );\n\n useEffect(() => {\n if (!open) return;\n window.addEventListener(\"message\", handleOAuthMessage);\n return () => window.removeEventListener(\"message\", handleOAuthMessage);\n }, [open, handleOAuthMessage]);\n\n // -----------------------------------------------------------------------\n // OAuth start\n // -----------------------------------------------------------------------\n\n async function startOAuth() {\n const { language = \"pt-br\", idWl = 1, accountId, token } = config;\n\n setOauthStatus(\"waiting\");\n\n try {\n // 1. Get auth URL from backend\n // If reconnecting an existing credential, pass credential_id so the\n // backend updates that specific credential instead of creating a new one.\n let authorizeUrl = `${gagentsApiUrl}/v1/${language}/${idWl}/accounts/${accountId}/oauth/authorize/${integration.slug}`;\n if (existingCredentialId) {\n authorizeUrl += `?credential_id=${existingCredentialId}`;\n }\n const response = await fetch(authorizeUrl, {\n headers: { Authorization: `Bearer ${token}` },\n });\n const result = await response.json();\n\n if (result.status !== 1 || !result.data?.auth_url) {\n setOauthStatus(\"error\");\n setOauthResult({\n success: false,\n error: result.message || \"Erro ao obter URL de autorização\",\n });\n return;\n }\n\n // 2. Open auth URL in popup\n const popup = window.open(\n result.data.auth_url,\n \"oauth-popup\",\n \"width=500,height=600,scrollbars=yes,resizable=yes\",\n );\n popupRef.current = popup;\n\n // Poll for popup closed without completing\n if (popup) {\n if (popupPollRef.current) {\n clearInterval(popupPollRef.current);\n }\n popupPollRef.current = setInterval(() => {\n if (popup.closed) {\n if (popupPollRef.current) {\n clearInterval(popupPollRef.current);\n popupPollRef.current = null;\n }\n setOauthStatus((prev) =>\n prev === \"waiting\" ? \"error\" : prev,\n );\n setOauthResult((prev) =>\n prev === null\n ? { success: false, error: \"Janela fechada antes de concluir\" }\n : prev,\n );\n }\n }, 500);\n }\n } catch (err) {\n setOauthStatus(\"error\");\n setOauthResult({\n success: false,\n error: \"Erro de rede ao obter URL de autorização\",\n });\n }\n }\n\n // -----------------------------------------------------------------------\n // Navigation\n // -----------------------------------------------------------------------\n\n function canAdvance(): boolean {\n switch (currentStep) {\n case \"info\":\n return true;\n case \"credentials\":\n if (integration.authType === \"oauth2\") {\n return oauthStatus === \"success\";\n }\n return apiKey.trim().length > 0;\n case \"config\":\n // Config step is optional -- can always advance\n return true;\n case \"confirm\":\n return true;\n default:\n return false;\n }\n }\n\n function goNext() {\n if (!canAdvance()) return;\n\n // Skip config step if not needed\n if (currentStep === \"credentials\" && !meta.hasConfigStep) {\n setCurrentStep(\"confirm\");\n return;\n }\n\n const nextIndex = currentIndex + 1;\n if (nextIndex < STEPS.length) {\n setCurrentStep(STEPS[nextIndex]);\n }\n }\n\n function goPrev() {\n // Skip config step backwards if not needed\n if (currentStep === \"confirm\" && !meta.hasConfigStep) {\n setCurrentStep(\"credentials\");\n return;\n }\n\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n setCurrentStep(STEPS[prevIndex]);\n }\n }\n\n // -----------------------------------------------------------------------\n // Complete\n // -----------------------------------------------------------------------\n\n async function handleComplete() {\n setIsSubmitting(true);\n try {\n // The actual credential creation happened during OAuth callback\n // or will happen via API key submission. Here we just finalize.\n //\n // For OAuth, the credential was already created by the backend callback.\n // The parent component handles any additional linking (agent_tool creation)\n // and query invalidation via the onComplete callback.\n //\n // Call onComplete BEFORE closing the dialog so query invalidation\n // triggers while the dialog is still mounted (avoids stale UI).\n\n onComplete();\n\n toast.success(\n `${integration.name} ${isReconnect ? \"reconectado\" : \"configurado\"} com sucesso!`,\n );\n } catch {\n toast.error(\"Erro ao finalizar configuração\");\n } finally {\n setIsSubmitting(false);\n }\n }\n\n // -----------------------------------------------------------------------\n // Render\n // -----------------------------------------------------------------------\n\n const selectedConfigOption =\n configOptions.find((o) => o.id === selectedConfigValue) || null;\n\n const isLastStep = currentStep === \"confirm\";\n\n // Effective steps (may skip config)\n const effectiveSteps = meta.hasConfigStep\n ? STEPS\n : STEPS.filter((s) => s !== \"config\");\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{integration.name}</DialogTitle>\n </DialogHeader>\n\n {/* Step indicator */}\n <StepIndicator steps={effectiveSteps} currentStep={currentStep} />\n\n {/* Step content */}\n <div className=\"min-h-[280px] py-2\">\n {currentStep === \"info\" && (\n <InfoStep\n integration={integration}\n meta={meta}\n />\n )}\n {currentStep === \"credentials\" && (\n <CredentialsStep\n integration={integration}\n meta={meta}\n oauthStatus={oauthStatus}\n oauthResult={oauthResult}\n apiKey={apiKey}\n onApiKeyChange={setApiKey}\n onStartOAuth={startOAuth}\n isReconnect={isReconnect}\n />\n )}\n {currentStep === \"config\" && (\n <ConfigStep\n integration={integration}\n options={configOptions}\n isLoading={configLoading}\n selectedValue={selectedConfigValue}\n onValueChange={setSelectedConfigValue}\n />\n )}\n {currentStep === \"confirm\" && (\n <ConfirmStep\n integration={integration}\n oauthResult={oauthResult}\n selectedConfigOption={selectedConfigOption}\n enableOnComplete={enableOnComplete}\n onEnableChange={setEnableOnComplete}\n />\n )}\n </div>\n\n {/* Footer */}\n <DialogFooter className=\"flex-row justify-between sm:justify-between\">\n <div>\n {currentStep === \"info\" ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n >\n Cancelar\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={goPrev}\n className=\"gap-1\"\n >\n <ChevronLeft aria-hidden=\"true\" className=\"h-4 w-4\" />\n Voltar\n </Button>\n )}\n </div>\n <div>\n {isLastStep ? (\n <Button\n type=\"button\"\n onClick={handleComplete}\n disabled={isSubmitting}\n className=\"gap-1\"\n >\n {isSubmitting ? (\n <Loader2\n aria-hidden=\"true\"\n className=\"h-4 w-4 animate-spin\"\n />\n ) : (\n <Check aria-hidden=\"true\" className=\"h-4 w-4\" />\n )}\n Concluir\n </Button>\n ) : (\n <Button\n type=\"button\"\n onClick={goNext}\n disabled={!canAdvance()}\n className=\"gap-1\"\n >\n Continuar\n <ChevronRight aria-hidden=\"true\" className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Step Indicator\n// ---------------------------------------------------------------------------\n\nfunction StepIndicator({\n steps,\n currentStep,\n}: {\n steps: WizardStep[];\n currentStep: WizardStep;\n}) {\n const currentIndex = steps.indexOf(currentStep);\n\n return (\n <div\n className=\"flex items-center justify-center gap-1 py-2\"\n role=\"list\"\n aria-label=\"Passos do assistente\"\n >\n {steps.map((step, i) => {\n const isCompleted = i < currentIndex;\n const isCurrent = step === currentStep;\n\n return (\n <div key={step} className=\"flex items-center\" role=\"listitem\">\n {/* Circle */}\n <div\n className={`\n flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium\n transition-colors duration-200\n ${\n isCurrent\n ? \"bg-primary text-primary-foreground\"\n : isCompleted\n ? \"bg-green-600 text-white\"\n : \"bg-muted text-muted-foreground\"\n }\n `}\n aria-current={isCurrent ? \"step\" : undefined}\n aria-label={`${STEP_LABELS[step]}${isCompleted ? \" (concluído)\" : isCurrent ? \" (atual)\" : \"\"}`}\n >\n {isCompleted ? (\n <Check aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n ) : (\n i + 1\n )}\n </div>\n {/* Label */}\n <span\n className={`\n ml-1.5 hidden text-xs sm:inline\n ${isCurrent ? \"font-medium text-foreground\" : \"text-muted-foreground\"}\n `}\n >\n {STEP_LABELS[step]}\n </span>\n {/* Connector line */}\n {i < steps.length - 1 && (\n <div\n className={`\n mx-2 h-px w-6\n ${i < currentIndex ? \"bg-green-600\" : \"bg-border\"}\n `}\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","'use client';\n\nimport { Check, Info } from \"lucide-react\";\nimport type { IntegrationDefinition } from \"../../../data/integrations-registry\";\nimport type { WizardIntegrationMeta } from \"../types\";\n\ninterface InfoStepProps {\n integration: IntegrationDefinition;\n meta: WizardIntegrationMeta;\n}\n\nexport function InfoStep({ integration, meta }: InfoStepProps) {\n return (\n <div className=\"space-y-6\">\n {/* Header */}\n <div className=\"flex items-start gap-4\">\n {meta.icon && (\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-muted\">\n {meta.icon}\n </div>\n )}\n <div className=\"space-y-1\">\n <h3 className=\"text-lg font-semibold\">{integration.name}</h3>\n <p className=\"text-sm text-muted-foreground\">\n {integration.description}\n </p>\n </div>\n </div>\n\n {/* Capabilities */}\n {meta.capabilities.length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-medium\">O que esta integração permite:</h4>\n <ul className=\"space-y-2\">\n {meta.capabilities.map((cap, i) => (\n <li key={i} className=\"flex items-start gap-2 text-sm\">\n <Check\n aria-hidden=\"true\"\n className=\"mt-0.5 h-4 w-4 shrink-0 text-green-600\"\n />\n <div>\n <span className=\"font-medium\">{cap.label}</span>\n {cap.description && (\n <span className=\"text-muted-foreground\">\n {\" \"}\n — {cap.description}\n </span>\n )}\n </div>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Requirements */}\n {meta.requirements.length > 0 && (\n <div className=\"space-y-3\">\n <h4 className=\"text-sm font-medium\">Requisitos:</h4>\n <ul className=\"space-y-2\">\n {meta.requirements.map((req, i) => (\n <li\n key={i}\n className=\"flex items-start gap-2 text-sm text-muted-foreground\"\n >\n <Info\n aria-hidden=\"true\"\n className=\"mt-0.5 h-4 w-4 shrink-0 text-blue-500\"\n />\n <span>{req}</span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { CheckCircle2, Loader2, AlertCircle, Shield } from \"lucide-react\";\nimport { Button, Input, Label } from \"@greatapps/greatauth-ui/ui\";\nimport type { IntegrationDefinition } from \"../../../data/integrations-registry\";\nimport type { WizardIntegrationMeta, OAuthStatus, OAuthResult } from \"../types\";\n\ninterface CredentialsStepProps {\n integration: IntegrationDefinition;\n meta: WizardIntegrationMeta;\n oauthStatus: OAuthStatus;\n oauthResult: OAuthResult | null;\n apiKey: string;\n onApiKeyChange: (value: string) => void;\n onStartOAuth: () => void;\n isReconnect?: boolean;\n}\n\nexport function CredentialsStep({\n integration,\n meta,\n oauthStatus,\n oauthResult,\n apiKey,\n onApiKeyChange,\n onStartOAuth,\n isReconnect = false,\n}: CredentialsStepProps) {\n if (integration.authType === \"oauth2\") {\n return (\n <OAuthCredentials\n integration={integration}\n meta={meta}\n oauthStatus={oauthStatus}\n oauthResult={oauthResult}\n onStartOAuth={onStartOAuth}\n isReconnect={isReconnect}\n />\n );\n }\n\n return <ApiKeyCredentials apiKey={apiKey} onApiKeyChange={onApiKeyChange} />;\n}\n\n// ---------------------------------------------------------------------------\n// OAuth flow UI\n// ---------------------------------------------------------------------------\n\nfunction OAuthCredentials({\n integration,\n meta,\n oauthStatus,\n oauthResult,\n onStartOAuth,\n isReconnect,\n}: {\n integration: IntegrationDefinition;\n meta: WizardIntegrationMeta;\n oauthStatus: OAuthStatus;\n oauthResult: OAuthResult | null;\n onStartOAuth: () => void;\n isReconnect: boolean;\n}) {\n const providerLabel = meta.providerLabel || integration.name;\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold\">Autenticação</h3>\n <p className=\"text-sm text-muted-foreground\">\n {isReconnect\n ? `Reconecte sua conta ${providerLabel} para renovar a autorização.`\n : `Conecte sua conta ${providerLabel} para permitir o acesso.`}\n </p>\n </div>\n\n {/* OAuth status area */}\n <div className=\"flex flex-col items-center gap-4 rounded-lg border p-6\">\n {oauthStatus === \"idle\" && (\n <Button\n onClick={onStartOAuth}\n size=\"lg\"\n className=\"gap-2\"\n >\n {meta.icon}\n {isReconnect\n ? `Reconectar com ${providerLabel}`\n : `Conectar com ${providerLabel}`}\n </Button>\n )}\n\n {oauthStatus === \"waiting\" && (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <Loader2\n aria-hidden=\"true\"\n className=\"h-8 w-8 animate-spin text-muted-foreground\"\n />\n <div>\n <p className=\"text-sm font-medium\">Aguardando autorização...</p>\n <p className=\"text-xs text-muted-foreground\">\n Complete o login na janela que foi aberta.\n </p>\n </div>\n </div>\n )}\n\n {oauthStatus === \"success\" && oauthResult && (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <CheckCircle2\n aria-hidden=\"true\"\n className=\"h-8 w-8 text-green-600\"\n />\n <div>\n <p className=\"text-sm font-medium text-green-700\">\n Conectado com sucesso!\n </p>\n {oauthResult.email && (\n <p className=\"text-xs text-muted-foreground\">\n {oauthResult.email}\n </p>\n )}\n </div>\n </div>\n )}\n\n {oauthStatus === \"error\" && (\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <AlertCircle\n aria-hidden=\"true\"\n className=\"h-8 w-8 text-destructive\"\n />\n <div>\n <p className=\"text-sm font-medium text-destructive\">\n Falha na conexão\n </p>\n {oauthResult?.error && (\n <p className=\"text-xs text-muted-foreground\">\n {oauthResult.error}\n </p>\n )}\n </div>\n <Button variant=\"outline\" onClick={onStartOAuth} size=\"sm\">\n Tentar novamente\n </Button>\n </div>\n )}\n </div>\n\n {/* Security note */}\n <div className=\"flex items-start gap-2 rounded-md bg-muted/50 p-3\">\n <Shield\n aria-hidden=\"true\"\n className=\"mt-0.5 h-4 w-4 shrink-0 text-green-600\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Seus dados estão seguros. Usamos OAuth 2.0 para autenticação — nunca\n armazenamos sua senha. Você pode revogar o acesso a qualquer momento\n nas configurações da sua conta {providerLabel}.\n </p>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// API Key flow UI\n// ---------------------------------------------------------------------------\n\nfunction ApiKeyCredentials({\n apiKey,\n onApiKeyChange,\n}: {\n apiKey: string;\n onApiKeyChange: (value: string) => void;\n}) {\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold\">Autenticação</h3>\n <p className=\"text-sm text-muted-foreground\">\n Insira a chave de API para conectar a integração.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"integration-api-key\">Chave de API</Label>\n <Input\n id=\"integration-api-key\"\n type=\"password\"\n autoComplete=\"off\"\n placeholder=\"Insira sua chave de API...\"\n value={apiKey}\n onChange={(e) => onApiKeyChange(e.target.value)}\n />\n </div>\n\n <div className=\"flex items-start gap-2 rounded-md bg-muted/50 p-3\">\n <Shield\n aria-hidden=\"true\"\n className=\"mt-0.5 h-4 w-4 shrink-0 text-green-600\"\n />\n <p className=\"text-xs text-muted-foreground\">\n Sua chave de API é armazenada de forma segura e encriptada. Nunca é\n exposta no frontend.\n </p>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { Loader2 } from \"lucide-react\";\nimport {\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@greatapps/greatauth-ui/ui\";\nimport type { IntegrationDefinition } from \"../../../data/integrations-registry\";\n\nexport interface ConfigOption {\n id: string;\n label: string;\n description?: string;\n}\n\ninterface ConfigStepProps {\n integration: IntegrationDefinition;\n /** Available options loaded from backend (e.g. calendars) */\n options: ConfigOption[];\n isLoading: boolean;\n selectedValue: string;\n onValueChange: (value: string) => void;\n /** Custom label for the select dropdown */\n selectLabel?: string;\n /** Custom placeholder */\n selectPlaceholder?: string;\n}\n\nexport function ConfigStep({\n integration,\n options,\n isLoading,\n selectedValue,\n onValueChange,\n selectLabel,\n selectPlaceholder,\n}: ConfigStepProps) {\n const label = selectLabel || getDefaultLabel(integration.slug);\n const placeholder =\n selectPlaceholder || getDefaultPlaceholder(integration.slug);\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold\">Configuração</h3>\n <p className=\"text-sm text-muted-foreground\">\n Configure as opções específicas da integração.\n </p>\n </div>\n\n {isLoading ? (\n <div className=\"flex flex-col items-center gap-3 py-8\">\n <Loader2\n aria-hidden=\"true\"\n className=\"h-6 w-6 animate-spin text-muted-foreground\"\n />\n <p className=\"text-sm text-muted-foreground\">\n Carregando opções...\n </p>\n </div>\n ) : options.length === 0 ? (\n <div className=\"rounded-lg border border-dashed p-6 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n Nenhuma opção disponível. A configuração padrão será usada.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <Label htmlFor=\"integration-config-select\">{label}</Label>\n <Select value={selectedValue} onValueChange={onValueChange}>\n <SelectTrigger id=\"integration-config-select\">\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => (\n <SelectItem key={opt.id} value={opt.id}>\n <span>{opt.label}</span>\n {opt.description && (\n <span className=\"ml-2 text-xs text-muted-foreground\">\n ({opt.description})\n </span>\n )}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getDefaultLabel(slug: string): string {\n switch (slug) {\n case \"google_calendar\":\n return \"Calendário\";\n default:\n return \"Opção\";\n }\n}\n\nfunction getDefaultPlaceholder(slug: string): string {\n switch (slug) {\n case \"google_calendar\":\n return \"Selecione o calendário...\";\n default:\n return \"Selecione uma opção...\";\n }\n}\n","'use client';\n\nimport { CheckCircle2 } from \"lucide-react\";\nimport { Label } from \"@greatapps/greatauth-ui/ui\";\nimport type { IntegrationDefinition } from \"../../../data/integrations-registry\";\nimport type { OAuthResult } from \"../types\";\nimport type { ConfigOption } from \"./config-step\";\n\ninterface ConfirmStepProps {\n integration: IntegrationDefinition;\n oauthResult: OAuthResult | null;\n selectedConfigOption: ConfigOption | null;\n enableOnComplete: boolean;\n onEnableChange: (enabled: boolean) => void;\n}\n\nexport function ConfirmStep({\n integration,\n oauthResult,\n selectedConfigOption,\n enableOnComplete,\n onEnableChange,\n}: ConfirmStepProps) {\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold\">Confirmação</h3>\n <p className=\"text-sm text-muted-foreground\">\n Revise as configurações antes de concluir.\n </p>\n </div>\n\n {/* Summary */}\n <div className=\"space-y-3 rounded-lg border p-4\">\n <SummaryRow label=\"Integração\" value={integration.name} />\n\n {oauthResult?.email && (\n <SummaryRow label=\"Conta conectada\" value={oauthResult.email} />\n )}\n\n {selectedConfigOption && (\n <SummaryRow\n label={getConfigLabel(integration.slug)}\n value={selectedConfigOption.label}\n />\n )}\n\n <SummaryRow\n label=\"Tipo de autenticação\"\n value={integration.authType === \"oauth2\" ? \"OAuth 2.0\" : \"API Key\"}\n />\n </div>\n\n {/* Enable toggle */}\n <div className=\"flex items-center justify-between rounded-lg border p-4\">\n <div className=\"space-y-0.5\">\n <Label htmlFor=\"enable-on-complete\" className=\"text-sm font-medium\">\n Ativar imediatamente\n </Label>\n <p className=\"text-xs text-muted-foreground\">\n A integração ficará ativa assim que concluir o assistente.\n </p>\n </div>\n <button\n id=\"enable-on-complete\"\n role=\"switch\"\n type=\"button\"\n aria-checked={enableOnComplete}\n onClick={() => onEnableChange(!enableOnComplete)}\n className={`\n relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent\n transition-colors duration-200 ease-in-out focus-visible:outline-none focus-visible:ring-2\n focus-visible:ring-ring focus-visible:ring-offset-2\n ${enableOnComplete ? \"bg-primary\" : \"bg-muted\"}\n `}\n >\n <span\n aria-hidden=\"true\"\n className={`\n pointer-events-none inline-block h-5 w-5 transform rounded-full bg-background shadow-lg\n ring-0 transition duration-200 ease-in-out\n ${enableOnComplete ? \"translate-x-5\" : \"translate-x-0\"}\n `}\n />\n </button>\n </div>\n\n {/* Success indicator */}\n <div className=\"flex items-center gap-2 rounded-md bg-green-50 p-3 dark:bg-green-950/20\">\n <CheckCircle2\n aria-hidden=\"true\"\n className=\"h-4 w-4 shrink-0 text-green-600\"\n />\n <p className=\"text-xs text-green-700 dark:text-green-400\">\n Tudo pronto! Clique em "Concluir" para finalizar a\n configuração.\n </p>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction SummaryRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium\">{value}</span>\n </div>\n );\n}\n\nfunction getConfigLabel(slug: string): string {\n switch (slug) {\n case \"google_calendar\":\n return \"Calendário\";\n default:\n return \"Configuração\";\n }\n}\n","import { useState } from \"react\";\nimport { AgentsTable } from \"../components/agents/agents-table\";\nimport { AgentFormDialog } from \"../components/agents/agent-form-dialog\";\nimport { Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plus } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\n\nexport interface AgentsPageProps {\n config: GagentsHookConfig;\n onNavigateToAgent?: (agentId: number) => void;\n title?: string;\n subtitle?: string;\n}\n\nexport function AgentsPage({\n config,\n onNavigateToAgent,\n title = \"Agentes AI\",\n subtitle = \"Gerencie seus agentes de atendimento inteligente\",\n}: AgentsPageProps) {\n const [createOpen, setCreateOpen] = useState(false);\n\n return (\n <div className=\"flex flex-col gap-4 p-4 md:p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <Button onClick={() => setCreateOpen(true)} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Novo Agente\n </Button>\n </div>\n\n <AgentsTable config={config} onNavigateToAgent={onNavigateToAgent} />\n\n <AgentFormDialog\n config={config}\n open={createOpen}\n onOpenChange={setCreateOpen}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { useAgent } from \"../hooks\";\nimport { AgentTabs } from \"../components/agents/agent-tabs\";\nimport { AgentEditForm } from \"../components/agents/agent-edit-form\";\nimport { Badge, Button, Skeleton } from \"@greatapps/greatauth-ui/ui\";\nimport { EntityAvatar } from \"@greatapps/greatauth-ui\";\nimport { ArrowLeft, Pencil } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\n\nexport interface AgentDetailPageProps {\n config: GagentsHookConfig;\n agentId: number;\n onBack?: () => void;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n}\n\nexport function AgentDetailPage({\n config,\n agentId,\n onBack,\n renderChatLink,\n}: AgentDetailPageProps) {\n const { data: agent, isLoading } = useAgent(config, agentId);\n const [editOpen, setEditOpen] = useState(false);\n\n if (isLoading) {\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-8 w-48\" />\n <Skeleton className=\"h-10 w-full\" />\n <Skeleton className=\"h-64 w-full\" />\n </div>\n );\n }\n\n if (!agent) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 p-8\">\n <p className=\"text-muted-foreground\">Agente não encontrado</p>\n {onBack && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onBack}>\n <ArrowLeft className=\"mr-2 h-4 w-4\" />\n Voltar para agentes\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-6 p-4 md:p-6\">\n <div className=\"rounded-lg border p-4 md:p-6\">\n <div className=\"flex flex-col gap-4 md:flex-row md:items-start md:gap-6\">\n <div className=\"flex items-start gap-3 flex-1\">\n {onBack && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Voltar\"\n className=\"shrink-0 mt-1\"\n onClick={onBack}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n )}\n\n <EntityAvatar photo={agent.photo} name={agent.title} size=\"xl\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h1 className=\"text-xl font-semibold\">{agent.title}</h1>\n <Badge\n variant={agent.active ? \"default\" : \"destructive\"}\n className=\"text-xs\"\n >\n {agent.active ? \"Ativo\" : \"Inativo\"}\n </Badge>\n </div>\n </div>\n </div>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"shrink-0 self-start\"\n onClick={() => setEditOpen(true)}\n >\n <Pencil className=\"mr-2 h-4 w-4\" />\n Editar\n </Button>\n </div>\n </div>\n\n <AgentTabs\n agent={agent}\n config={config}\n renderChatLink={renderChatLink}\n />\n\n {editOpen && (\n <AgentEditForm\n agent={agent}\n config={config}\n idAccount={config.accountId}\n open={editOpen}\n onOpenChange={setEditOpen}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Blocks, Plug, Settings } from \"lucide-react\";\n\nimport type { GagentsHookConfig } from \"../hooks/types\";\nimport { CapabilitiesTab } from \"../components/capabilities/capabilities-tab\";\nimport { IntegrationsTab } from \"../components/capabilities/integrations-tab\";\nimport { AdvancedTab } from \"../components/capabilities/advanced-tab\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface AgentCapabilitiesPageProps {\n config: GagentsHookConfig;\n agentId: number;\n gagentsApiUrl: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AgentCapabilitiesPage({\n config,\n agentId,\n gagentsApiUrl,\n}: AgentCapabilitiesPageProps) {\n return (\n <div className=\"space-y-4\">\n <div>\n <h2 className=\"text-lg font-semibold\">Capacidades e Integrações</h2>\n <p className=\"text-sm text-muted-foreground\">\n Configure o que este agente pode fazer e quais integrações ele utiliza.\n </p>\n </div>\n\n <Tabs defaultValue=\"capacidades\">\n <TabsList>\n <TabsTrigger value=\"capacidades\" className=\"flex items-center gap-1.5\">\n <Blocks aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Capacidades\n </TabsTrigger>\n <TabsTrigger value=\"integracoes\" className=\"flex items-center gap-1.5\">\n <Plug aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Integrações\n </TabsTrigger>\n <TabsTrigger value=\"avancado\" className=\"flex items-center gap-1.5\">\n <Settings aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Avançado\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"capacidades\" className=\"mt-4\">\n <CapabilitiesTab config={config} agentId={agentId} />\n </TabsContent>\n\n <TabsContent value=\"integracoes\" className=\"mt-4\">\n <IntegrationsTab config={config} agentId={agentId} />\n </TabsContent>\n\n <TabsContent value=\"avancado\" className=\"mt-4\">\n <AdvancedTab\n config={config}\n agentId={agentId}\n gagentsApiUrl={gagentsApiUrl}\n />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { ToolsTable } from \"../components/tools/tools-table\";\nimport { ToolFormDialog } from \"../components/tools/tool-form-dialog\";\nimport { Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plus } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\nimport type { Tool } from \"../types\";\n\nexport interface ToolsPageProps {\n config: GagentsHookConfig;\n title?: string;\n subtitle?: string;\n}\n\nexport function ToolsPage({\n config,\n title = \"Ferramentas\",\n subtitle = \"Gerencie as ferramentas disponíveis para seus agentes\",\n}: ToolsPageProps) {\n const [createOpen, setCreateOpen] = useState(false);\n const [editTool, setEditTool] = useState<Tool | undefined>(undefined);\n\n return (\n <div className=\"flex flex-col gap-4 p-4 md:p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n <Button onClick={() => setCreateOpen(true)} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Nova Ferramenta\n </Button>\n </div>\n\n <ToolsTable config={config} onEdit={(tool) => setEditTool(tool)} />\n\n <ToolFormDialog\n config={config}\n open={createOpen}\n onOpenChange={setCreateOpen}\n />\n\n <ToolFormDialog\n config={config}\n open={!!editTool}\n onOpenChange={(open) => !open && setEditTool(undefined)}\n tool={editTool}\n />\n </div>\n );\n}\n","import { useToolCredentials } from \"../hooks\";\nimport { ToolCredentialsForm } from \"../components/tools/tool-credentials-form\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\n\nexport interface CredentialsPageProps {\n config: GagentsHookConfig;\n gagentsApiUrl: string;\n title?: string;\n subtitle?: string;\n}\n\nexport function CredentialsPage({\n config,\n gagentsApiUrl,\n title = \"Credenciais\",\n subtitle = \"Gerencie as credenciais de autenticação das ferramentas\",\n}: CredentialsPageProps) {\n const { data: credentialsData, isLoading: credentialsLoading } =\n useToolCredentials(config);\n\n const credentials = credentialsData?.data || [];\n\n return (\n <div className=\"flex flex-col gap-4 p-4 md:p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n </div>\n\n <ToolCredentialsForm\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n credentials={credentials}\n isLoading={credentialsLoading}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useMemo, useCallback, useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { useToolCredentials, useAgents, useTools } from \"../hooks\";\nimport { IntegrationCard } from \"../components/capabilities/integration-card\";\nimport { IntegrationWizard } from \"../components/capabilities/integration-wizard\";\nimport { useIntegrationState, type IntegrationCardData } from \"../hooks/use-integrations\";\nimport { useDeleteToolCredential, useUpdateToolCredential } from \"../hooks/use-settings\";\nimport type { WizardIntegrationMeta } from \"../components/capabilities/types\";\nimport type { ConfigOption } from \"../components/capabilities/wizard-steps/config-step\";\nimport { Plug, Loader2 } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\nimport type { Agent, Tool, ToolCredential } from \"../types\";\n\nexport interface IntegrationsManagementPageProps {\n config: GagentsHookConfig;\n gagentsApiUrl: string;\n /** Resolve wizard metadata for a given integration card. */\n resolveWizardMeta?: (card: IntegrationCardData) => WizardIntegrationMeta;\n /** Load config options after OAuth completes (e.g. list of calendars). */\n loadConfigOptions?: (credentialId: number) => Promise<ConfigOption[]>;\n /** Called after wizard completes successfully. */\n onWizardComplete?: () => void;\n title?: string;\n subtitle?: string;\n}\n\nexport function IntegrationsManagementPage({\n config,\n gagentsApiUrl,\n resolveWizardMeta,\n loadConfigOptions,\n onWizardComplete,\n title = \"Integrações\",\n subtitle = \"Gerencie as integrações da conta.\",\n}: IntegrationsManagementPageProps) {\n const queryClient = useQueryClient();\n\n // Integration cards state (account-level, agentId=null)\n const { cards, isLoading: cardsLoading } = useIntegrationState(config, null);\n\n // Wizard state\n const [wizardOpen, setWizardOpen] = useState(false);\n const [activeCard, setActiveCard] = useState<IntegrationCardData | null>(null);\n\n // Mutations for card actions\n const deleteCredential = useDeleteToolCredential(config);\n const updateCredential = useUpdateToolCredential(config);\n\n const handleConnect = useCallback((card: IntegrationCardData) => {\n setActiveCard(card);\n setWizardOpen(true);\n }, []);\n\n const handleReconnect = useCallback((card: IntegrationCardData) => {\n setActiveCard(card);\n setWizardOpen(true);\n }, []);\n\n const handleDisconnect = useCallback((card: IntegrationCardData) => {\n if (!card.credentialId) return;\n updateCredential.mutate({\n id: card.credentialId,\n body: { status: \"inactive\" },\n });\n }, [updateCredential]);\n\n const handleDelete = useCallback((card: IntegrationCardData) => {\n if (!card.credentialId) return;\n deleteCredential.mutate(card.credentialId);\n }, [deleteCredential]);\n\n const handleWizardClose = useCallback((open: boolean) => {\n if (!open) {\n setActiveCard(null);\n }\n setWizardOpen(open);\n }, []);\n\n const handleWizardComplete = useCallback(() => {\n // Invalidate ALL queries that useIntegrationState and related hooks depend on.\n // Use broad prefix-based invalidation to cover every accountId/param variant.\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tool-credentials\"] });\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"tools\"] });\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agent-tools\"] });\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"agent-capabilities\"] });\n queryClient.invalidateQueries({ queryKey: [\"greatagents\", \"capabilities\"] });\n\n setWizardOpen(false);\n setActiveCard(null);\n onWizardComplete?.();\n }, [onWizardComplete, queryClient]);\n\n // Resolve wizard meta with sensible defaults\n const wizardMeta: WizardIntegrationMeta | null = activeCard\n ? (resolveWizardMeta?.(activeCard) ?? {\n capabilities: [],\n requirements: [],\n hasConfigStep: false,\n })\n : null;\n\n // Split integration cards\n const connectedCards = cards.filter(\n (c) => !c.isAddNew && (c.state === \"connected\" || c.state === \"expired\"),\n );\n const otherCards = cards.filter(\n (c) => c.isAddNew || c.state === \"coming_soon\",\n );\n\n return (\n <div className=\"flex flex-col gap-4 p-4 md:p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n <p className=\"text-sm text-muted-foreground\">{subtitle}</p>\n </div>\n </div>\n\n {cardsLoading ? (\n <div className=\"flex items-center justify-center py-16\">\n <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n </div>\n ) : cards.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center gap-3 py-16 text-muted-foreground\">\n <Plug className=\"h-10 w-10\" />\n <p className=\"text-sm\">Nenhuma integração disponível</p>\n </div>\n ) : (\n <div className=\"space-y-6\">\n {/* Connected accounts */}\n {connectedCards.length > 0 && (\n <div>\n <h3 className=\"mb-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\">\n Contas conectadas\n </h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {connectedCards.map((card) => (\n <IntegrationCard\n key={`${card.definition.slug}-cred-${card.credentialId}`}\n card={card}\n onConnect={handleConnect}\n onReconnect={handleReconnect}\n onDisconnect={handleDisconnect}\n onDelete={handleDelete}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Add new / coming soon */}\n {otherCards.length > 0 && (\n <div>\n {connectedCards.length > 0 && (\n <h3 className=\"mb-3 text-xs font-medium uppercase tracking-wider text-muted-foreground\">\n Adicionar integração\n </h3>\n )}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {otherCards.map((card) => {\n const key = card.isAddNew\n ? `${card.definition.slug}-add-new`\n : card.definition.slug;\n return (\n <IntegrationCard\n key={key}\n card={card}\n onConnect={handleConnect}\n />\n );\n })}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Integration Wizard */}\n {activeCard && wizardMeta && (\n <IntegrationWizard\n open={wizardOpen}\n onOpenChange={handleWizardClose}\n integration={activeCard.definition}\n meta={wizardMeta}\n agentId={0}\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n existingCredentialId={activeCard.credentialId}\n onComplete={handleWizardComplete}\n loadConfigOptions={loadConfigOptions}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useQuery","useQuery","useQuery","useMutation","useQueryClient","useQuery","useQueryClient","useMutation","useMemo","useMemo","useMemo","useMemo","useState","Button","Input","toast","jsx","jsxs","useState","useEffect","useState","Button","Input","Label","Switch","Sheet","SheetContent","SheetHeader","SheetTitle","SheetFooter","Loader2","toast","ImageCropUpload","Fragment","jsx","jsxs","msToSeconds","secondsToMs","agentToFormState","useState","useEffect","useState","Input","Button","Switch","Textarea","Label","Badge","Sheet","SheetContent","SheetHeader","SheetTitle","SheetFooter","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","React","jsx","useCallback","useState","Button","Trash2","jsx","jsxs","useState","useCallback","Button","Trash2","Pencil","Plus","GripVertical","toast","jsx","jsxs","useState","Button","Badge","Switch","Sheet","SheetContent","SheetHeader","SheetTitle","Label","Input","Textarea","SheetFooter","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","useState","useRef","useCallback","useEffect","useMemo","Button","Label","Loader2","toast","jsx","jsxs","useRef","useCallback","useEffect","useState","useMemo","toast","Label","Button","Loader2","useState","useMemo","Button","Badge","Skeleton","toast","Fragment","jsx","jsxs","useState","useMemo","useState","Skeleton","Badge","Skeleton","Button","X","jsx","jsxs","jsx","jsxs","useState","Skeleton","Badge","jsx","useState","useCallback","useEffect","useMemo","Switch","Badge","Button","Skeleton","Loader2","Pencil","toast","jsx","jsxs","useState","useEffect","useMemo","useCallback","toast","Skeleton","Button","Badge","Loader2","Switch","Pencil","useCallback","useState","useEffect","useMemo","Switch","Tooltip","TooltipContent","TooltipTrigger","Checkbox","Button","Loader2","ChevronDown","Pencil","toast","jsx","jsxs","useState","useEffect","useMemo","useCallback","toast","Loader2","Tooltip","TooltipTrigger","TooltipContent","ChevronDown","Switch","Checkbox","Pencil","Button","Target","MessageCircle","Plug","jsx","jsxs","useState","Switch","Badge","Button","Skeleton","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Input","Textarea","Sheet","SheetContent","SheetHeader","SheetTitle","SheetFooter","Label","Trash2","Plus","Settings2","toast","jsx","jsxs","useState","useMemo","useState","DataTable","Input","Badge","Tooltip","TooltipTrigger","TooltipContent","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Button","Pencil","Trash2","Search","format","ptBR","toast","Fragment","jsx","jsxs","useColumns","useState","useMemo","useState","Sheet","SheetContent","SheetHeader","SheetTitle","SheetFooter","Button","Input","Textarea","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Loader2","toast","jsx","jsxs","slugify","useState","useMemo","useState","DataTable","Input","Button","Badge","Tooltip","TooltipTrigger","TooltipContent","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Trash2","Search","format","ptBR","toast","jsx","jsxs","formatDate","useColumns","useState","useMemo","useState","Badge","Button","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","CalendarSync","Plug","Settings","Plus","Trash2","Fragment","jsx","jsxs","ICON_MAP","CalendarSync","Plug","Settings","Plus","resolveIcon","useState","Button","badge","Badge","Trash2","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","useState","jsx","jsxs","useState","useCallback","useEffect","useRef","useState","Dialog","DialogContent","DialogHeader","DialogTitle","Button","Loader2","Check","toast","Info","jsx","jsxs","Loader2","Button","Input","Label","jsx","jsxs","Loader2","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","jsx","jsxs","CheckCircle2","Label","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","toast","Dialog","DialogContent","DialogHeader","DialogTitle","Button","Loader2","Check","useState","Button","Plus","jsx","jsxs","useState","useState","Badge","Button","Skeleton","EntityAvatar","Pencil","jsx","jsxs","useState","Tabs","TabsList","TabsTrigger","TabsContent","Blocks","Plug","Settings","jsx","jsxs","Tabs","TabsList","TabsTrigger","Blocks","Plug","Settings","TabsContent","useState","Button","Plus","jsx","jsxs","useState","jsx","jsxs","useCallback","useState","useQueryClient","Plug","Loader2","jsx","jsxs","useQueryClient","useState","useCallback"]}
|