@greatapps/greatagents-ui 0.3.8 → 0.3.9

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.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/agent-prompt-editor.tsx","../src/components/conversations/agent-conversations-table.tsx","../src/components/conversations/conversation-view.tsx","../src/components/conversations/agent-conversations-panel.tsx","../src/pages/agent-capabilities-page.tsx","../src/components/capabilities/capabilities-tab.tsx","../src/components/capabilities/integration-card.tsx","../src/components/capabilities/integrations-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/components/capabilities/advanced-tab.tsx","../src/components/tools/tools-table.tsx","../src/components/tools/tool-credentials-form.tsx","../src/components/tools/tool-form-dialog.tsx","../src/components/agents/agent-tabs.tsx","../src/components/agents/agent-tools-list.tsx","../src/pages/agents-page.tsx","../src/pages/agent-detail-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\">\n > & { prompt?: string; 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\" | \"prompt\" | \"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\" | \"prompt\" | \"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 prompt?: 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 prompt?: 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 prompt?: 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 prompt: 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 };\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}\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 */\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 return INTEGRATIONS_REGISTRY.map((def) => {\n // coming_soon short-circuit\n if (def.status === \"coming_soon\") {\n return {\n definition: def,\n state: \"coming_soon\" as const,\n credential: null,\n tool: null,\n sharedByAgentsCount: 0,\n linkedToAgent: false,\n };\n }\n\n // Find tool record matching registry slug\n const matchedTool = tools.find((t) => t.slug === def.slug) ?? null;\n\n // Find credential for that tool\n const matchedCredential = matchedTool\n ? credentials.find((c) => c.id_tool === matchedTool.id) ?? null\n : null;\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 // Sharing indicator: credential exists at account level (available to all agents)\n // When a credential is account-scoped, any agent can use it — show as \"shared\"\n const sharedByAgentsCount = matchedCredential ? 1 : 0;\n\n // Determine state\n let state: IntegrationCardState = \"available\";\n if (matchedCredential) {\n state =\n matchedCredential.status === \"expired\" ? \"expired\" : \"connected\";\n }\n\n return {\n definition: def,\n state,\n credential: matchedCredential,\n tool: matchedTool,\n sharedByAgentsCount,\n linkedToAgent,\n };\n });\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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\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 <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>\n {isEditing ? \"Editar Agente\" : \"Novo Agente\"}\n </DialogTitle>\n </DialogHeader>\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 ?? 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 <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 || !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 </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\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 <DialogFooter>\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 </DialogFooter>\n </form>\n );\n\n if (open !== undefined && onOpenChange) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Editar Agente</DialogTitle>\n </DialogHeader>\n {formContent}\n </DialogContent>\n </Dialog>\n );\n }\n\n return <div className=\"max-w-lg pt-4\">{formContent}</div>;\n}\n","import { useState } from \"react\";\nimport type { Agent, Objective } 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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\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 { 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 prompt: string;\n}\n\nconst EMPTY_FORM: ObjectiveFormState = { title: \"\", slug: \"\", prompt: \"\" };\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 setForm({\n title: objective.title,\n slug: objective.slug || \"\",\n prompt: objective.prompt || \"\",\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 if (editTarget) {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: editTarget.id,\n body: {\n title: form.title.trim(),\n slug: effectiveSlug,\n prompt: form.prompt.trim() || null,\n },\n });\n toast.success(\"Objetivo atualizado\");\n } else {\n await createMutation.mutateAsync({\n idAgent: agent.id,\n body: {\n title: form.title.trim(),\n slug: effectiveSlug,\n prompt: form.prompt.trim() || null,\n order: nextOrder,\n },\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.prompt && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {objective.prompt}\n </p>\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 Dialog */}\n <Dialog open={formOpen} onOpenChange={setFormOpen}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>\n {editTarget ? \"Editar Objetivo\" : \"Novo Objetivo\"}\n </DialogTitle>\n </DialogHeader>\n <div className=\"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-prompt\">Instruções do Objetivo</Label>\n <Textarea\n id=\"objective-prompt\"\n name=\"prompt\"\n value={form.prompt}\n onChange={(e) =>\n setForm((f) => ({ ...f, prompt: e.target.value }))\n }\n placeholder=\"Instru\\u00e7\\u00f5es detalhadas que o agente seguir\\u00e1 quando este objetivo for ativado\\u2026\"\n rows={8}\n />\n <p className=\"text-xs text-muted-foreground\">\n Estas instruções são carregadas automaticamente quando o agente detecta que o utilizador precisa deste objetivo.\n </p>\n </div>\n </div>\n <DialogFooter>\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 </DialogFooter>\n </DialogContent>\n </Dialog>\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 { useState, useRef, useCallback, useEffect } from \"react\";\nimport type { Agent, PromptVersion, Objective, AgentTool, Tool } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { usePromptVersions } from \"../../hooks\";\nimport { useUpdateAgent } from \"../../hooks\";\nimport { useAgentTools } from \"../../hooks\";\nimport { useObjectives } from \"../../hooks\";\nimport { useTools } from \"../../hooks\";\nimport { Button, Input, Skeleton, Badge } from \"@greatapps/greatauth-ui/ui\";\nimport { FileText, Loader2, ChevronDown, ChevronUp, RotateCcw } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ninterface AgentPromptEditorProps {\n config: GagentsHookConfig;\n agent: Agent;\n}\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 buildPreview(\n promptText: string,\n objectives: Objective[],\n agentTools: AgentTool[],\n allTools: Tool[],\n): string {\n let preview = promptText;\n\n const activeObjectives = objectives.filter((o) => o.active);\n if (activeObjectives.length > 0) {\n preview += \"\\n\\n[SKILLS DISPONÍVEIS]\\n\";\n for (const obj of activeObjectives) {\n preview += `- ${obj.title}`;\n if (obj.prompt) preview += `: ${obj.prompt}`;\n preview += \"\\n\";\n }\n }\n\n const enabledAgentTools = agentTools.filter((at) => at.enabled);\n if (enabledAgentTools.length > 0) {\n const toolMap = new Map(allTools.map((t) => [t.id, t]));\n preview += \"\\n[TOOLS DISPONÍVEIS]\\n\";\n for (const at of enabledAgentTools) {\n const tool = toolMap.get(at.id_tool);\n const name = tool?.name || `Tool #${at.id_tool}`;\n const desc = tool?.description ? `: ${tool.description}` : \"\";\n preview += `- ${name}${desc}`;\n if (at.custom_instructions) {\n preview += `\\n Instruções: ${at.custom_instructions}`;\n }\n preview += \"\\n\";\n }\n }\n\n return preview;\n}\n\nexport function AgentPromptEditor({ config, agent }: AgentPromptEditorProps) {\n const { data: versionsData, isLoading } = usePromptVersions(config, agent.id);\n const updateAgent = useUpdateAgent(config);\n const { data: objectivesData } = useObjectives(config, agent.id);\n const { data: agentToolsData } = useAgentTools(config, agent.id);\n const { data: toolsData } = useTools(config);\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 const currentPromptContent = currentVersion?.prompt_content ?? \"\";\n\n const [trackedAgentId, setTrackedAgentId] = useState(agent.id);\n const [promptText, setPromptText] = useState(currentPromptContent);\n const [promptInitialized, setPromptInitialized] = useState(false);\n const [changeNotes, setChangeNotes] = useState(\"\");\n const [showPreview, setShowPreview] = useState(false);\n const [compareVersionId, setCompareVersionId] = useState<number | null>(null);\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Initialize prompt text from current version when data loads\n if (!promptInitialized && currentPromptContent && !isLoading) {\n setPromptText(currentPromptContent);\n setPromptInitialized(true);\n }\n\n // Reset prompt text when agent changes\n if (trackedAgentId !== agent.id) {\n setTrackedAgentId(agent.id);\n setPromptText(currentPromptContent);\n setPromptInitialized(!!currentPromptContent);\n setCompareVersionId(null);\n }\n\n // Auto-resize textarea\n const autoResize = useCallback(() => {\n const el = textareaRef.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.max(300, el.scrollHeight)}px`;\n }, []);\n\n useEffect(() => {\n autoResize();\n }, [promptText, autoResize]);\n\n // Tab key support\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 value = el.value;\n const newValue = value.substring(0, start) + \" \" + value.substring(end);\n setPromptText(newValue);\n // Restore cursor position after React re-render\n requestAnimationFrame(() => {\n el.selectionStart = el.selectionEnd = start + 2;\n });\n }\n }\n\n const compareVersion = sortedVersions.find((v) => v.id === compareVersionId);\n\n // Diff: always compare selected older version against current\n const diffLines =\n currentVersion && compareVersion && compareVersion.id !== currentVersion.id\n ? computeDiff(compareVersion.prompt_content ?? \"\", currentVersion.prompt_content ?? \"\")\n : null;\n\n async function handleSave() {\n const body: Record<string, unknown> = {\n prompt: promptText.trim(),\n };\n if (changeNotes.trim()) {\n body.change_notes = changeNotes.trim();\n }\n\n try {\n await updateAgent.mutateAsync({ id: agent.id, body });\n setChangeNotes(\"\");\n toast.success(\"Prompt salvo com sucesso\");\n } catch {\n toast.error(\"Erro ao salvar prompt\");\n }\n }\n\n function handleRestore(version: PromptVersion) {\n setPromptText(version.prompt_content ?? \"\");\n setChangeNotes(`Restaurado da v${version.version_number}`);\n toast.info(\"Prompt restaurado no editor. Clique em Salvar para confirmar.\");\n }\n\n const charCount = promptText.length;\n const tokenEstimate = Math.ceil(charCount / 4);\n\n const objectives = objectivesData?.data || [];\n const agentTools = agentToolsData?.data || [];\n const allTools = toolsData?.data || [];\n const previewText = buildPreview(promptText, objectives, agentTools, allTools);\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 {/* Editor section */}\n <div className=\"min-w-0 flex-1 space-y-4\">\n {/* Textarea */}\n <div className=\"space-y-2\">\n <textarea\n ref={textareaRef}\n aria-label=\"Prompt do sistema\"\n name=\"prompt\"\n value={promptText}\n onChange={(e) => setPromptText(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Escreva o prompt do sistema aqui\\u2026\"\n disabled={updateAgent.isPending}\n className=\"w-full resize-none rounded-lg border bg-background p-3 font-mono text-sm leading-relaxed focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50\"\n style={{ minHeight: \"300px\" }}\n />\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 {/* Save row */}\n <div className=\"flex items-center gap-3\">\n <Input\n aria-label=\"Notas da alteração\"\n name=\"changeNotes\"\n value={changeNotes}\n onChange={(e) => setChangeNotes(e.target.value)}\n placeholder=\"O que mudou? (opcional)\"\n disabled={updateAgent.isPending}\n className=\"flex-1\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleSave();\n }\n }}\n />\n <Button\n onClick={handleSave}\n disabled={updateAgent.isPending || !promptText.trim()}\n >\n {updateAgent.isPending && (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Salvar\n </Button>\n </div>\n\n {/* Preview section */}\n <div className=\"rounded-lg border\">\n <button\n type=\"button\"\n onClick={() => setShowPreview((prev) => !prev)}\n className=\"flex w-full items-center justify-between px-4 py-3 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <span>Preview do prompt final</span>\n {showPreview ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronDown className=\"h-4 w-4\" />\n )}\n </button>\n {showPreview && (\n <div className=\"border-t px-4 py-3\">\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap font-mono text-sm leading-relaxed\">\n {previewText.split(\"\\n\").map((line, i) => {\n const isSection =\n line.startsWith(\"[SKILLS DISPONÍVEIS]\") ||\n line.startsWith(\"[TOOLS DISPONÍVEIS]\");\n return (\n <span\n key={i}\n className={isSection ? \"font-semibold text-muted-foreground\" : \"\"}\n >\n {line}\n {\"\\n\"}\n </span>\n );\n })}\n </pre>\n </div>\n )}\n </div>\n\n {/* Diff panel (when comparing) */}\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 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 {/* Timeline section (right) */}\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. Salve o prompt para criar a primeira versão.\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {sortedVersions.map((version, idx) => {\n const isCurrent = idx === 0;\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 </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 } from \"react\";\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 type { IntegrationCardData } from \"../hooks/use-integrations\";\nimport type { WizardIntegrationMeta } from \"../components/capabilities/types\";\nimport { CapabilitiesTab } from \"../components/capabilities/capabilities-tab\";\nimport { IntegrationsTab } from \"../components/capabilities/integrations-tab\";\nimport { IntegrationWizard } from \"../components/capabilities/integration-wizard\";\nimport { AdvancedTab } from \"../components/capabilities/advanced-tab\";\nimport type { ConfigOption } from \"../components/capabilities/wizard-steps/config-step\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface AgentCapabilitiesPageProps {\n config: GagentsHookConfig;\n agentId: number;\n gagentsApiUrl: string;\n /**\n * Resolve wizard metadata for a given integration card.\n * The consuming app provides this so the wizard gets correct\n * capabilities, requirements, and config step flag.\n */\n resolveWizardMeta?: (card: IntegrationCardData) => WizardIntegrationMeta;\n /**\n * Callback to load config options after OAuth completes\n * (e.g. load Google Calendar list). Forwarded to IntegrationWizard.\n */\n loadConfigOptions?: (credentialId: number) => Promise<ConfigOption[]>;\n /** Called after wizard completes successfully. */\n onWizardComplete?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Default wizard meta resolver\n// ---------------------------------------------------------------------------\n\nfunction defaultResolveWizardMeta(card: IntegrationCardData): WizardIntegrationMeta {\n return {\n capabilities: [\n { label: card.definition.name, description: card.definition.description },\n ],\n requirements: [],\n hasConfigStep: false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AgentCapabilitiesPage({\n config,\n agentId,\n gagentsApiUrl,\n resolveWizardMeta = defaultResolveWizardMeta,\n loadConfigOptions,\n onWizardComplete,\n}: AgentCapabilitiesPageProps) {\n // Wizard dialog state\n const [wizardOpen, setWizardOpen] = useState(false);\n const [activeCard, setActiveCard] = useState<IntegrationCardData | null>(null);\n\n const handleConnect = useCallback(\n (card: IntegrationCardData) => {\n setActiveCard(card);\n setWizardOpen(true);\n },\n [],\n );\n\n const handleWizardComplete = useCallback(() => {\n setWizardOpen(false);\n setActiveCard(null);\n onWizardComplete?.();\n }, [onWizardComplete]);\n\n const handleWizardOpenChange = useCallback((open: boolean) => {\n setWizardOpen(open);\n if (!open) setActiveCard(null);\n }, []);\n\n // Derive wizard meta from active card\n const wizardMeta = activeCard ? resolveWizardMeta(activeCard) : null;\n\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 serviços externos 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\n config={config}\n agentId={agentId}\n onConnect={handleConnect}\n />\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\n {/* Integration Wizard Dialog */}\n {activeCard && wizardMeta && (\n <IntegrationWizard\n open={wizardOpen}\n onOpenChange={handleWizardOpenChange}\n integration={activeCard.definition}\n meta={wizardMeta}\n agentId={agentId}\n config={config}\n onComplete={handleWizardComplete}\n gagentsApiUrl={gagentsApiUrl}\n existingCredentialId={activeCard.credential?.id}\n loadConfigOptions={loadConfigOptions}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useRef, 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 Calendar,\n Users,\n Settings,\n HeartHandshake,\n Package,\n ChevronDown,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\n\n// ---------------------------------------------------------------------------\n// Operation label mapping (pt-BR)\n// ---------------------------------------------------------------------------\n\nconst OPERATION_LABELS: Record<string, string> = {\n list: \"Listar\",\n view: \"Visualizar\",\n create: \"Criar\",\n update: \"Atualizar\",\n};\n\nfunction getOperationLabel(slug: string): string {\n return OPERATION_LABELS[slug] ?? slug;\n}\n\n// ---------------------------------------------------------------------------\n// Category icon mapping\n// ---------------------------------------------------------------------------\n\nconst CATEGORY_ICONS: Record<string, React.ElementType> = {\n agenda: Calendar,\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\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 stateToPayload(state: CapabilityState): AgentCapabilitiesPayload {\n const capabilities: AgentCapability[] = [];\n state.forEach((ops, mod) => {\n if (ops.size > 0) {\n capabilities.push({ module: mod, operations: Array.from(ops) });\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 statesEqual(a: CapabilityState, b: CapabilityState): boolean {\n if (a.size !== b.size) return false;\n for (const [mod, opsA] of a) {\n const opsB = b.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\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 [initialized, setInitialized] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Sync server data into local state on first load / refetch\n useEffect(() => {\n if (agentCaps && !initialized) {\n const state = buildStateFromAgent(agentCaps);\n setLocalState(state);\n setServerState(cloneState(state));\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 () => initialized && !statesEqual(localState, serverState),\n [localState, serverState, initialized],\n );\n\n // ------ Debounced save ------\n const scheduleSave = useCallback(\n (nextState: CapabilityState) => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n const payload = stateToPayload(nextState);\n updateMutation.mutate(\n { agentId, payload },\n {\n onSuccess: () => {\n setServerState(cloneState(nextState));\n toast.success(\"Capacidades salvas\");\n },\n onError: () => {\n // Rollback to server state\n setLocalState(cloneState(serverState));\n toast.error(\"Erro ao salvar capacidades\");\n },\n },\n );\n }, 500);\n },\n [agentId, updateMutation, serverState],\n );\n\n // ------ State mutation helpers ------\n const updateState = useCallback(\n (updater: (prev: CapabilityState) => CapabilityState) => {\n setLocalState((prev) => {\n const next = updater(prev);\n scheduleSave(next);\n return next;\n });\n },\n [scheduleSave],\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 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 if (debounceRef.current) clearTimeout(debounceRef.current);\n setLocalState(cloneState(serverState));\n }, [serverState]);\n\n const saveNow = useCallback(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const payload = stateToPayload(localState);\n updateMutation.mutate(\n { agentId, payload },\n {\n onSuccess: () => {\n setServerState(cloneState(localState));\n toast.success(\"Capacidades salvas\");\n },\n onError: () => {\n setLocalState(cloneState(serverState));\n toast.error(\"Erro ao salvar capacidades\");\n },\n },\n );\n }, [agentId, localState, serverState, 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\n return (\n <ModuleRow\n key={mod.slug}\n module={mod}\n isOn={isModuleOn}\n allOpsEnabled={allOpsEnabled}\n enabledOps={enabledOps ?? new Set()}\n onToggleModule={(on) => toggleModule(mod, on)}\n onToggleOperation={(op, on) =>\n toggleOperation(mod, op, on)\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 bg-background border-t py-3 px-4 -mx-4 flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">\n Você tem alterações não salvas.\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={discard}>\n Descartar\n </Button>\n <Button\n size=\"sm\"\n onClick={saveNow}\n disabled={updateMutation.isPending}\n >\n {updateMutation.isPending ? \"Salvando...\" : \"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 onToggleModule: (on: boolean) => void;\n onToggleOperation: (op: string, on: boolean) => void;\n}\n\nfunction ModuleRow({\n module: mod,\n isOn,\n enabledOps,\n onToggleModule,\n onToggleOperation,\n}: ModuleRowProps) {\n const [expanded, setExpanded] = useState(false);\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 flex flex-wrap gap-x-5 gap-y-1.5 pb-1\">\n {mod.operations.map((op) => {\n const checked = enabledOps.has(op);\n return (\n <label\n key={op}\n className=\"flex items-center gap-1.5 text-sm cursor-pointer\"\n >\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={checked ? \"\" : \"text-muted-foreground\"}>\n {getOperationLabel(op)}\n </span>\n </label>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { IntegrationCardData, IntegrationCardState } from \"../../hooks/use-integrations\";\nimport { Badge, Button, Tooltip, TooltipContent, TooltipTrigger } from \"@greatapps/greatauth-ui/ui\";\nimport {\n CalendarSync,\n Plug,\n Settings,\n RefreshCw,\n Users,\n Clock,\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 Users,\n Clock,\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\nfunction getActionLabel(state: IntegrationCardState): string {\n switch (state) {\n case \"available\":\n return \"Conectar\";\n case \"connected\":\n return \"Configurar\";\n case \"expired\":\n return \"Reconectar\";\n default:\n return \"\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationCardProps {\n card: IntegrationCardData;\n onConnect: (card: IntegrationCardData) => void;\n}\n\nexport function IntegrationCard({ card, onConnect }: IntegrationCardProps) {\n const { definition, state, sharedByAgentsCount } = card;\n const Icon = resolveIcon(definition.icon);\n const badge = STATE_BADGES[state];\n const actionLabel = getActionLabel(state);\n const isComingSoon = state === \"coming_soon\";\n\n return (\n <div\n className={cn(\n \"group relative flex flex-col gap-3 rounded-xl border bg-card p-5 transition-shadow\",\n isComingSoon\n ? \"opacity-60 cursor-default\"\n : \"hover:shadow-md cursor-pointer\",\n )}\n role=\"button\"\n tabIndex={isComingSoon ? -1 : 0}\n aria-label={`${definition.name} — ${badge.label}`}\n aria-disabled={isComingSoon}\n onClick={() => !isComingSoon && onConnect(card)}\n onKeyDown={(e) => {\n if (!isComingSoon && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onConnect(card);\n }\n }}\n >\n {/* Header row */}\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\n {/* Name + description */}\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\n {/* Footer */}\n <div className=\"mt-auto flex items-center justify-between gap-2 pt-1\">\n {sharedByAgentsCount > 0 ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex items-center gap-1 text-xs text-blue-600 dark:text-blue-400\">\n <Users className=\"h-3.5 w-3.5\" />\n Compartilhada\n </span>\n </TooltipTrigger>\n <TooltipContent>\n Esta credencial está disponível para todos os agentes da conta\n </TooltipContent>\n </Tooltip>\n ) : (\n <span />\n )}\n\n {!isComingSoon && (\n <Button\n variant={state === \"expired\" ? \"destructive\" : \"outline\"}\n size=\"sm\"\n className=\"text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onConnect(card);\n }}\n >\n {actionLabel}\n </Button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useIntegrationState, type IntegrationCardData } from \"../../hooks/use-integrations\";\nimport { IntegrationCard } from \"./integration-card\";\nimport { Plug, Loader2 } from \"lucide-react\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationsTabProps {\n config: GagentsHookConfig;\n agentId: number | null;\n /** Called when user clicks a card action (connect / configure / reconnect).\n * The consuming app wires this to the wizard (Story 18.9). */\n onConnect: (card: IntegrationCardData) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function IntegrationsTab({\n config,\n agentId,\n onConnect,\n}: IntegrationsTabProps) {\n const { cards, isLoading } = useIntegrationState(config, agentId);\n\n // Loading state\n if (isLoading) {\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\n if (cards.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\">Nenhuma integração disponível</p>\n </div>\n );\n }\n\n return (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {cards.map((card) => (\n <IntegrationCard\n key={card.definition.slug}\n card={card}\n onConnect={onConnect}\n />\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 const response = await fetch(\n `${gagentsApiUrl}/v1/${language}/${idWl}/accounts/${accountId}/oauth/authorize/${integration.slug}`,\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 // via the onComplete callback.\n\n onComplete();\n onOpenChange(false);\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 &quot;Concluir&quot; 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","'use client';\n\nimport { useState } from \"react\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useToolCredentials } from \"../../hooks\";\nimport { ToolsTable } from \"../tools/tools-table\";\nimport { ToolCredentialsForm } from \"../tools/tool-credentials-form\";\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 { data: credentialsData, isLoading: isLoadingCredentials } =\n useToolCredentials(config);\n const credentials = credentialsData?.data ?? [];\n\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 e credenciais.\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 {/* Credenciais section */}\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-medium\">Credenciais</h3>\n <ToolCredentialsForm\n credentials={credentials}\n isLoading={isLoadingCredentials}\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n />\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","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 { 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 useCreateToolCredential,\n useUpdateToolCredential,\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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Trash2, Pencil, Link, 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 createOpen?: boolean;\n onCreateOpenChange?: (open: boolean) => void;\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 onEdit: (cred: ToolCredential) => void,\n onConnect: (cred: ToolCredential) => void,\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 function getToolType(idTool: number | null): string | null {\n if (!idTool) return null;\n const tool = tools.find((t) => t.id === idTool);\n return tool?.type || null;\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 {getToolType(row.original.id_tool) === \"oauth2\" && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label=\"Vincular\"\n disabled\n >\n <Link className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Em breve</TooltipContent>\n </Tooltip>\n )}\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={() => 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 createOpen: externalCreateOpen,\n onCreateOpenChange,\n}: ToolCredentialsFormProps) {\n const createMutation = useCreateToolCredential(config);\n const updateMutation = useUpdateToolCredential(config);\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 [internalCreateOpen, setInternalCreateOpen] = useState(false);\n const showCreateDialog = externalCreateOpen ?? internalCreateOpen;\n const setShowCreateDialog = onCreateOpenChange ?? setInternalCreateOpen;\n const [createForm, setCreateForm] = useState({\n id_tool: \"\",\n label: \"\",\n credentials_encrypted: \"\",\n expires_at: \"\",\n });\n\n const [editTarget, setEditTarget] = useState<ToolCredential | null>(null);\n const [editForm, setEditForm] = useState({\n id_tool: \"\",\n label: \"\",\n credentials_encrypted: \"\",\n expires_at: \"\",\n status: \"\" as \"active\" | \"expired\" | \"\",\n });\n\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) => startEdit(cred),\n (cred) => handleConnect(cred),\n (cred) => setRemoveTarget(cred),\n );\n\n async function handleCreate() {\n const idTool = parseInt(createForm.id_tool, 10);\n if (!idTool || !createForm.label.trim() || !createForm.credentials_encrypted.trim()) return;\n\n try {\n const result = await createMutation.mutateAsync({\n id_tool: idTool,\n label: createForm.label.trim(),\n credentials_encrypted: createForm.credentials_encrypted.trim(),\n ...(createForm.expires_at ? { expires_at: createForm.expires_at } : {}),\n });\n if (result.status === 1) {\n toast.success(\"Credencial criada\");\n setShowCreateDialog(false);\n setCreateForm({ id_tool: \"\", label: \"\", credentials_encrypted: \"\", expires_at: \"\" });\n } else {\n toast.error(result.message || \"Erro ao criar credencial\");\n }\n } catch {\n toast.error(\"Erro ao criar credencial\");\n }\n }\n\n function startEdit(cred: ToolCredential) {\n setEditTarget(cred);\n setEditForm({\n id_tool: cred.id_tool ? String(cred.id_tool) : \"\",\n label: cred.label || \"\",\n credentials_encrypted: \"\",\n expires_at: cred.expires_at || \"\",\n status: cred.status,\n });\n }\n\n async function handleSaveEdit() {\n if (!editTarget) return;\n const body: Record<string, unknown> = {};\n const newIdTool = editForm.id_tool ? parseInt(editForm.id_tool, 10) : null;\n if (newIdTool && newIdTool !== editTarget.id_tool) {\n body.id_tool = newIdTool;\n }\n if (editForm.label.trim() && editForm.label.trim() !== (editTarget.label || \"\")) {\n body.label = editForm.label.trim();\n }\n if (editForm.credentials_encrypted.trim()) {\n body.credentials_encrypted = editForm.credentials_encrypted.trim();\n }\n if (editForm.expires_at !== (editTarget.expires_at || \"\")) {\n body.expires_at = editForm.expires_at || null;\n }\n if (editForm.status && editForm.status !== editTarget.status) {\n body.status = editForm.status;\n }\n\n if (Object.keys(body).length === 0) {\n setEditTarget(null);\n return;\n }\n\n try {\n const result = await updateMutation.mutateAsync({\n id: editTarget.id,\n body: body as Parameters<typeof updateMutation.mutateAsync>[0][\"body\"],\n });\n if (result.status === 1) {\n toast.success(\"Credencial atualizada\");\n setEditTarget(null);\n } else {\n toast.error(result.message || \"Erro ao atualizar credencial\");\n }\n } catch {\n toast.error(\"Erro ao atualizar credencial\");\n }\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 function handleConnect(cred: ToolCredential) {\n if (!config.accountId || !config.token) return;\n const language = config.language ?? \"pt-br\";\n const idWl = config.idWl ?? 1;\n const url = `${gagentsApiUrl}/v1/${language}/${idWl}/accounts/${config.accountId}/oauth/connect?id_tool=${cred.id_tool}`;\n window.open(url, \"_blank\");\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 {/* Create Dialog */}\n <Dialog open={showCreateDialog} onOpenChange={setShowCreateDialog}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Nova Credencial</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"cred-tool\" className=\"mb-1 block text-sm font-medium\">\n Ferramenta *\n </label>\n <Select\n value={createForm.id_tool}\n onValueChange={(val) =>\n setCreateForm((f) => ({ ...f, id_tool: val }))\n }\n >\n <SelectTrigger id=\"cred-tool\">\n <SelectValue placeholder=\"Selecione a ferramenta\" />\n </SelectTrigger>\n <SelectContent>\n {tools.map((tool) => (\n <SelectItem key={tool.id} value={String(tool.id)}>\n {tool.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label htmlFor=\"cred-label\" className=\"mb-1 block text-sm font-medium\">\n Label *\n </label>\n <Input\n id=\"cred-label\"\n name=\"label\"\n value={createForm.label}\n onChange={(e) =>\n setCreateForm((f) => ({ ...f, label: e.target.value }))\n }\n placeholder=\"Ex: Google Calendar - Clínica São Paulo\"\n />\n </div>\n <div>\n <label htmlFor=\"cred-credential\" className=\"mb-1 block text-sm font-medium\">\n Credencial *\n </label>\n <Input\n id=\"cred-credential\"\n name=\"credential\"\n autoComplete=\"off\"\n type=\"password\"\n value={createForm.credentials_encrypted}\n onChange={(e) =>\n setCreateForm((f) => ({\n ...f,\n credentials_encrypted: e.target.value,\n }))\n }\n placeholder=\"Credencial encriptada\"\n />\n </div>\n <div>\n <label htmlFor=\"cred-expires\" className=\"mb-1 block text-sm font-medium\">\n Data de Expiração (opcional)\n </label>\n <Input\n id=\"cred-expires\"\n name=\"expires\"\n type=\"date\"\n value={createForm.expires_at}\n onChange={(e) =>\n setCreateForm((f) => ({ ...f, expires_at: e.target.value }))\n }\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setShowCreateDialog(false)}\n >\n Cancelar\n </Button>\n <Button\n onClick={handleCreate}\n disabled={\n !createForm.id_tool ||\n !createForm.label.trim() ||\n !createForm.credentials_encrypted.trim() ||\n createMutation.isPending\n }\n >\n Criar\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Edit Dialog */}\n <Dialog\n open={!!editTarget}\n onOpenChange={(open) => !open && setEditTarget(null)}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Editar Credencial</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"edit-cred-tool\" className=\"mb-1 block text-sm font-medium\">\n Ferramenta *\n </label>\n <Select\n value={editForm.id_tool}\n onValueChange={(val) =>\n setEditForm((f) => ({ ...f, id_tool: val }))\n }\n >\n <SelectTrigger id=\"edit-cred-tool\">\n <SelectValue placeholder=\"Selecione a ferramenta\" />\n </SelectTrigger>\n <SelectContent>\n {tools.map((tool) => (\n <SelectItem key={tool.id} value={String(tool.id)}>\n {tool.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label htmlFor=\"edit-cred-label\" className=\"mb-1 block text-sm font-medium\">\n Label\n </label>\n <Input\n id=\"edit-cred-label\"\n name=\"label\"\n value={editForm.label}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, label: e.target.value }))\n }\n placeholder=\"Label da credencial\"\n />\n </div>\n <div>\n <label htmlFor=\"edit-cred-credential\" className=\"mb-1 block text-sm font-medium\">\n Nova Credencial (vazio = manter atual)\n </label>\n <Input\n id=\"edit-cred-credential\"\n name=\"credential\"\n autoComplete=\"off\"\n type=\"password\"\n value={editForm.credentials_encrypted}\n onChange={(e) =>\n setEditForm((f) => ({\n ...f,\n credentials_encrypted: e.target.value,\n }))\n }\n placeholder=\"Nova credencial\"\n />\n </div>\n <div>\n <label htmlFor=\"edit-cred-expires\" className=\"mb-1 block text-sm font-medium\">\n Data de Expiração\n </label>\n <Input\n id=\"edit-cred-expires\"\n name=\"expires\"\n type=\"date\"\n value={editForm.expires_at}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, expires_at: e.target.value }))\n }\n />\n </div>\n <div>\n <label htmlFor=\"edit-cred-status\" className=\"mb-1 block text-sm font-medium\">Status</label>\n <Select\n value={editForm.status || undefined}\n onValueChange={(val) =>\n setEditForm((f) => ({\n ...f,\n status: val as \"active\" | \"expired\",\n }))\n }\n >\n <SelectTrigger id=\"edit-cred-status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"active\">Ativo</SelectItem>\n <SelectItem value=\"expired\">Expirado</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setEditTarget(null)}>\n Cancelar\n </Button>\n <Button\n onClick={handleSaveEdit}\n disabled={updateMutation.isPending}\n >\n Salvar\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\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","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 type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport type { IntegrationCardData } from \"../../hooks/use-integrations\";\nimport type { WizardIntegrationMeta } from \"../capabilities/types\";\nimport type { ConfigOption } from \"../capabilities/wizard-steps/config-step\";\nimport { AgentObjectivesList } from \"./agent-objectives-list\";\nimport { AgentPromptEditor } from \"./agent-prompt-editor\";\nimport { AgentConversationsPanel } from \"../conversations/agent-conversations-panel\";\nimport { AgentCapabilitiesPage } from \"../../pages/agent-capabilities-page\";\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Target, FileText, MessageCircle, Blocks } from \"lucide-react\";\n\ninterface AgentTabsProps {\n agent: Agent;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n /** Required for the Capacidades tab — gagents API URL for OAuth flows and advanced features. Falls back to config.baseUrl. */\n gagentsApiUrl?: string;\n /** Resolve wizard metadata for a given integration card. */\n resolveWizardMeta?: (card: IntegrationCardData) => WizardIntegrationMeta;\n /** Callback to load config options after OAuth completes. */\n loadConfigOptions?: (credentialId: number) => Promise<ConfigOption[]>;\n /** Called after wizard completes successfully. */\n onWizardComplete?: () => void;\n}\n\nexport function AgentTabs({\n agent,\n config,\n renderChatLink,\n gagentsApiUrl,\n resolveWizardMeta,\n loadConfigOptions,\n onWizardComplete,\n}: AgentTabsProps) {\n const apiUrl = gagentsApiUrl || config.baseUrl;\n\n return (\n <Tabs defaultValue=\"prompt\">\n <TabsList>\n <TabsTrigger value=\"prompt\" className=\"flex items-center gap-1.5\">\n <FileText aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Prompt\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=\"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 </TabsList>\n\n <TabsContent value=\"prompt\" className=\"mt-4\">\n <AgentPromptEditor 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 <AgentCapabilitiesPage\n config={config}\n agentId={agent.id}\n gagentsApiUrl={apiUrl}\n resolveWizardMeta={resolveWizardMeta}\n loadConfigOptions={loadConfigOptions}\n onWizardComplete={onWizardComplete}\n />\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 </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 &apos;Adicionar Ferramenta&apos; 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 { 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","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 { useState } from \"react\";\nimport { useToolCredentials } from \"../hooks\";\nimport { ToolCredentialsForm } from \"../components/tools/tool-credentials-form\";\nimport { Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plus } from \"lucide-react\";\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 const [createOpen, setCreateOpen] = useState(false);\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 <Button onClick={() => setCreateOpen(true)} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Nova Credencial\n </Button>\n </div>\n\n <ToolCredentialsForm\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n credentials={credentials}\n isLoading={credentialsLoading}\n createOpen={createOpen}\n onCreateOpenChange={setCreateOpen}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from \"react\";\nimport { useToolCredentials, useAgents, useTools } from \"../hooks\";\nimport { ToolCredentialsForm } from \"../components/tools/tool-credentials-form\";\nimport { IntegrationsTab } from \"../components/capabilities/integrations-tab\";\nimport {\n Badge,\n Button,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Plus, Plug, KeyRound, Info } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\nimport type { IntegrationCardData } from \"../hooks/use-integrations\";\nimport type { Agent, Tool, ToolCredential } from \"../types\";\n\nexport interface IntegrationsManagementPageProps {\n config: GagentsHookConfig;\n gagentsApiUrl: string;\n /** Called when user clicks connect/reconnect on an integration card. */\n onConnect?: (card: IntegrationCardData) => void;\n title?: string;\n subtitle?: string;\n}\n\n/**\n * Build a map of credential id → list of agent names that use it.\n * Cross-references tools (which link credential via id) with agents\n * that have agent_tools referencing those tools.\n *\n * Since we don't have an account-level agent_tools endpoint, we\n * approximate by checking which tools are linked to credentials and\n * showing credential-level stats.\n */\nfunction useCredentialAgentSummary(\n credentials: ToolCredential[],\n tools: Tool[],\n agents: Agent[],\n) {\n return useMemo(() => {\n // Build a set of tool IDs that have credentials\n const toolIdsWithCredentials = new Set(\n credentials.map((c) => c.id_tool).filter(Boolean),\n );\n\n // Count how many credentials are linked to tools that agents could use\n const linkedCount = credentials.filter(\n (c) => c.id_tool && toolIdsWithCredentials.has(c.id_tool),\n ).length;\n\n return {\n totalCredentials: credentials.length,\n linkedToTools: linkedCount,\n totalAgents: agents.length,\n totalTools: tools.length,\n };\n }, [credentials, tools, agents]);\n}\n\nexport function IntegrationsManagementPage({\n config,\n gagentsApiUrl,\n onConnect,\n title = \"Integrações e Credenciais\",\n subtitle = \"Gerencie todas as integrações e credenciais da conta.\",\n}: IntegrationsManagementPageProps) {\n const { data: credentialsData, isLoading: credentialsLoading } =\n useToolCredentials(config);\n const { data: agentsData } = useAgents(config);\n const { data: toolsData } = useTools(config);\n const [createOpen, setCreateOpen] = useState(false);\n\n const credentials = credentialsData?.data || [];\n const agents: Agent[] = agentsData?.data || [];\n const tools: Tool[] = toolsData?.data || [];\n\n const summary = useCredentialAgentSummary(credentials, tools, agents);\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 <Tabs defaultValue=\"integrations\" className=\"w-full\">\n <TabsList>\n <TabsTrigger value=\"integrations\" className=\"gap-2\">\n <Plug className=\"h-4 w-4\" />\n Integrações\n </TabsTrigger>\n <TabsTrigger value=\"credentials\" className=\"gap-2\">\n <KeyRound className=\"h-4 w-4\" />\n Credenciais\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"integrations\" className=\"mt-4\">\n <IntegrationsTab\n config={config}\n agentId={null}\n onConnect={onConnect ?? (() => {})}\n />\n </TabsContent>\n\n <TabsContent value=\"credentials\" className=\"mt-4\">\n {/* Summary bar */}\n {!credentialsLoading && (\n <div className=\"flex items-center gap-4 rounded-lg border bg-muted/50 px-4 py-3 mb-4\">\n <Info className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex flex-wrap items-center gap-3 text-sm\">\n <span>\n <Badge variant=\"secondary\" className=\"mr-1\">\n {summary.totalCredentials}\n </Badge>\n {summary.totalCredentials === 1\n ? \"credencial configurada\"\n : \"credenciais configuradas\"}\n </span>\n <span className=\"text-muted-foreground\">|</span>\n <span>\n <Badge variant=\"secondary\" className=\"mr-1\">\n {summary.linkedToTools}\n </Badge>\n {summary.linkedToTools === 1\n ? \"vinculada a ferramentas\"\n : \"vinculadas a ferramentas\"}\n </span>\n <span className=\"text-muted-foreground\">|</span>\n <span>\n <Badge variant=\"secondary\" className=\"mr-1\">\n {summary.totalAgents}\n </Badge>\n {summary.totalAgents === 1\n ? \"agente na conta\"\n : \"agentes na conta\"}\n </span>\n </div>\n </div>\n )}\n\n <div className=\"flex items-center justify-end mb-4\">\n <Button onClick={() => setCreateOpen(true)} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Nova Credencial\n </Button>\n </div>\n\n <ToolCredentialsForm\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n credentials={credentials}\n isLoading={credentialsLoading}\n createOpen={createOpen}\n onCreateOpenChange={setCreateOpen}\n />\n </TabsContent>\n </Tabs>\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","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Loader2","toast","ImageCropUpload","jsx","jsxs","msToSeconds","secondsToMs","agentToFormState","useState","useEffect","useState","Input","Button","Switch","Label","Badge","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","React","jsx","Trash2","Pencil","toast","jsx","jsxs","useState","Button","Badge","Switch","Dialog","DialogContent","DialogHeader","DialogTitle","Label","Input","DialogFooter","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","useState","useCallback","useEffect","Button","Input","Skeleton","Badge","Loader2","toast","jsx","jsxs","useState","useCallback","useEffect","useState","Skeleton","Badge","Skeleton","Button","jsx","jsxs","jsx","jsxs","useState","Skeleton","Badge","jsx","useState","useCallback","Plug","Settings","useState","useCallback","useRef","useEffect","useMemo","Switch","Badge","Button","Skeleton","ChevronDown","toast","jsx","jsxs","useState","useRef","useEffect","useMemo","useCallback","Badge","Button","Tooltip","TooltipContent","TooltipTrigger","Settings","Users","jsx","jsxs","Settings","Users","Badge","Tooltip","TooltipTrigger","TooltipContent","Button","Plug","Loader2","jsx","jsxs","useCallback","useEffect","useRef","useState","Dialog","DialogContent","DialogFooter","DialogHeader","DialogTitle","Button","Loader2","Check","toast","jsx","jsxs","Loader2","Button","Input","Label","jsx","jsxs","Loader2","Label","jsx","jsxs","CheckCircle2","Label","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","toast","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Loader2","Check","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","useMemo","useState","DataTable","Input","Button","Badge","Tooltip","TooltipTrigger","TooltipContent","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Trash2","Pencil","Search","format","ptBR","toast","jsx","jsxs","formatDate","useColumns","useState","useMemo","useState","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Input","Textarea","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Loader2","toast","jsx","jsxs","slugify","useState","Info","jsx","jsxs","useState","jsx","jsxs","useState","useCallback","Plug","Settings","Tabs","TabsList","TabsTrigger","TabsContent","Target","FileText","MessageCircle","Blocks","jsx","jsxs","useState","Switch","Badge","Button","Skeleton","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Input","Textarea","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Trash2","Plus","Settings2","toast","jsx","jsxs","useState","useState","Button","Plus","jsx","jsxs","useState","useState","Badge","Button","Skeleton","EntityAvatar","Pencil","jsx","jsxs","useState","useState","Button","Plus","jsx","jsxs","useState","useState","Button","Plus","jsx","jsxs","useState","useState","useMemo","Badge","Button","Tabs","TabsContent","TabsList","TabsTrigger","Plus","Plug","Info","jsx","jsxs","useMemo","useState"]}
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/agent-prompt-editor.tsx","../src/components/conversations/agent-conversations-table.tsx","../src/components/conversations/conversation-view.tsx","../src/components/conversations/agent-conversations-panel.tsx","../src/pages/agent-capabilities-page.tsx","../src/components/capabilities/capabilities-tab.tsx","../src/components/capabilities/integration-card.tsx","../src/components/capabilities/integrations-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/components/capabilities/advanced-tab.tsx","../src/components/tools/tools-table.tsx","../src/components/tools/tool-credentials-form.tsx","../src/components/tools/tool-form-dialog.tsx","../src/components/agents/agent-tabs.tsx","../src/components/agents/agent-tools-list.tsx","../src/pages/agents-page.tsx","../src/pages/agent-detail-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\">\n > & { prompt?: string; 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\" | \"prompt\" | \"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\" | \"prompt\" | \"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 prompt?: 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 prompt?: 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 prompt?: 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 prompt: 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 };\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}\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 */\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 return INTEGRATIONS_REGISTRY.map((def) => {\n // coming_soon short-circuit\n if (def.status === \"coming_soon\") {\n return {\n definition: def,\n state: \"coming_soon\" as const,\n credential: null,\n tool: null,\n sharedByAgentsCount: 0,\n linkedToAgent: false,\n };\n }\n\n // Find tool record matching registry slug\n const matchedTool = tools.find((t) => t.slug === def.slug) ?? null;\n\n // Find credential for that tool\n const matchedCredential = matchedTool\n ? credentials.find((c) => c.id_tool === matchedTool.id) ?? null\n : null;\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 // Sharing indicator: credential exists at account level (available to all agents)\n // When a credential is account-scoped, any agent can use it — show as \"shared\"\n const sharedByAgentsCount = matchedCredential ? 1 : 0;\n\n // Determine state\n let state: IntegrationCardState = \"available\";\n if (matchedCredential) {\n state =\n matchedCredential.status === \"expired\" ? \"expired\" : \"connected\";\n }\n\n return {\n definition: def,\n state,\n credential: matchedCredential,\n tool: matchedTool,\n sharedByAgentsCount,\n linkedToAgent,\n };\n });\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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\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 <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>\n {isEditing ? \"Editar Agente\" : \"Novo Agente\"}\n </DialogTitle>\n </DialogHeader>\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 ?? 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 <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 || !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 </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\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 <DialogFooter>\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 </DialogFooter>\n </form>\n );\n\n if (open !== undefined && onOpenChange) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Editar Agente</DialogTitle>\n </DialogHeader>\n {formContent}\n </DialogContent>\n </Dialog>\n );\n }\n\n return <div className=\"max-w-lg pt-4\">{formContent}</div>;\n}\n","import { useState } from \"react\";\nimport type { Agent, Objective } 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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\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 { 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 prompt: string;\n}\n\nconst EMPTY_FORM: ObjectiveFormState = { title: \"\", slug: \"\", prompt: \"\" };\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 setForm({\n title: objective.title,\n slug: objective.slug || \"\",\n prompt: objective.prompt || \"\",\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 if (editTarget) {\n await updateMutation.mutateAsync({\n idAgent: agent.id,\n id: editTarget.id,\n body: {\n title: form.title.trim(),\n slug: effectiveSlug,\n prompt: form.prompt.trim() || null,\n },\n });\n toast.success(\"Objetivo atualizado\");\n } else {\n await createMutation.mutateAsync({\n idAgent: agent.id,\n body: {\n title: form.title.trim(),\n slug: effectiveSlug,\n prompt: form.prompt.trim() || null,\n order: nextOrder,\n },\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.prompt && (\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">\n {objective.prompt}\n </p>\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 Dialog */}\n <Dialog open={formOpen} onOpenChange={setFormOpen}>\n <DialogContent className=\"sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>\n {editTarget ? \"Editar Objetivo\" : \"Novo Objetivo\"}\n </DialogTitle>\n </DialogHeader>\n <div className=\"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-prompt\">Instruções do Objetivo</Label>\n <Textarea\n id=\"objective-prompt\"\n name=\"prompt\"\n value={form.prompt}\n onChange={(e) =>\n setForm((f) => ({ ...f, prompt: e.target.value }))\n }\n placeholder=\"Instru\\u00e7\\u00f5es detalhadas que o agente seguir\\u00e1 quando este objetivo for ativado\\u2026\"\n rows={8}\n />\n <p className=\"text-xs text-muted-foreground\">\n Estas instruções são carregadas automaticamente quando o agente detecta que o utilizador precisa deste objetivo.\n </p>\n </div>\n </div>\n <DialogFooter>\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 </DialogFooter>\n </DialogContent>\n </Dialog>\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 { useState, useRef, useCallback, useEffect } from \"react\";\nimport type { Agent, PromptVersion, Objective, AgentTool, Tool } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { usePromptVersions } from \"../../hooks\";\nimport { useUpdateAgent } from \"../../hooks\";\nimport { useAgentTools } from \"../../hooks\";\nimport { useObjectives } from \"../../hooks\";\nimport { useTools } from \"../../hooks\";\nimport { Button, Input, Skeleton, Badge } from \"@greatapps/greatauth-ui/ui\";\nimport { FileText, Loader2, ChevronDown, ChevronUp, RotateCcw } from \"lucide-react\";\nimport { toast } from \"sonner\";\n\ninterface AgentPromptEditorProps {\n config: GagentsHookConfig;\n agent: Agent;\n}\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 buildPreview(\n promptText: string,\n objectives: Objective[],\n agentTools: AgentTool[],\n allTools: Tool[],\n): string {\n let preview = promptText;\n\n const activeObjectives = objectives.filter((o) => o.active);\n if (activeObjectives.length > 0) {\n preview += \"\\n\\n[SKILLS DISPONÍVEIS]\\n\";\n for (const obj of activeObjectives) {\n preview += `- ${obj.title}`;\n if (obj.prompt) preview += `: ${obj.prompt}`;\n preview += \"\\n\";\n }\n }\n\n const enabledAgentTools = agentTools.filter((at) => at.enabled);\n if (enabledAgentTools.length > 0) {\n const toolMap = new Map(allTools.map((t) => [t.id, t]));\n preview += \"\\n[TOOLS DISPONÍVEIS]\\n\";\n for (const at of enabledAgentTools) {\n const tool = toolMap.get(at.id_tool);\n const name = tool?.name || `Tool #${at.id_tool}`;\n const desc = tool?.description ? `: ${tool.description}` : \"\";\n preview += `- ${name}${desc}`;\n if (at.custom_instructions) {\n preview += `\\n Instruções: ${at.custom_instructions}`;\n }\n preview += \"\\n\";\n }\n }\n\n return preview;\n}\n\nexport function AgentPromptEditor({ config, agent }: AgentPromptEditorProps) {\n const { data: versionsData, isLoading } = usePromptVersions(config, agent.id);\n const updateAgent = useUpdateAgent(config);\n const { data: objectivesData } = useObjectives(config, agent.id);\n const { data: agentToolsData } = useAgentTools(config, agent.id);\n const { data: toolsData } = useTools(config);\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 const currentPromptContent = currentVersion?.prompt_content ?? \"\";\n\n const [trackedAgentId, setTrackedAgentId] = useState(agent.id);\n const [promptText, setPromptText] = useState(currentPromptContent);\n const [promptInitialized, setPromptInitialized] = useState(false);\n const [changeNotes, setChangeNotes] = useState(\"\");\n const [showPreview, setShowPreview] = useState(false);\n const [compareVersionId, setCompareVersionId] = useState<number | null>(null);\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Initialize prompt text from current version when data loads\n if (!promptInitialized && currentPromptContent && !isLoading) {\n setPromptText(currentPromptContent);\n setPromptInitialized(true);\n }\n\n // Reset prompt text when agent changes\n if (trackedAgentId !== agent.id) {\n setTrackedAgentId(agent.id);\n setPromptText(currentPromptContent);\n setPromptInitialized(!!currentPromptContent);\n setCompareVersionId(null);\n }\n\n // Auto-resize textarea\n const autoResize = useCallback(() => {\n const el = textareaRef.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.max(300, el.scrollHeight)}px`;\n }, []);\n\n useEffect(() => {\n autoResize();\n }, [promptText, autoResize]);\n\n // Tab key support\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 value = el.value;\n const newValue = value.substring(0, start) + \" \" + value.substring(end);\n setPromptText(newValue);\n // Restore cursor position after React re-render\n requestAnimationFrame(() => {\n el.selectionStart = el.selectionEnd = start + 2;\n });\n }\n }\n\n const compareVersion = sortedVersions.find((v) => v.id === compareVersionId);\n\n // Diff: always compare selected older version against current\n const diffLines =\n currentVersion && compareVersion && compareVersion.id !== currentVersion.id\n ? computeDiff(compareVersion.prompt_content ?? \"\", currentVersion.prompt_content ?? \"\")\n : null;\n\n async function handleSave() {\n const body: Record<string, unknown> = {\n prompt: promptText.trim(),\n };\n if (changeNotes.trim()) {\n body.change_notes = changeNotes.trim();\n }\n\n try {\n await updateAgent.mutateAsync({ id: agent.id, body });\n setChangeNotes(\"\");\n toast.success(\"Prompt salvo com sucesso\");\n } catch {\n toast.error(\"Erro ao salvar prompt\");\n }\n }\n\n function handleRestore(version: PromptVersion) {\n setPromptText(version.prompt_content ?? \"\");\n setChangeNotes(`Restaurado da v${version.version_number}`);\n toast.info(\"Prompt restaurado no editor. Clique em Salvar para confirmar.\");\n }\n\n const charCount = promptText.length;\n const tokenEstimate = Math.ceil(charCount / 4);\n\n const objectives = objectivesData?.data || [];\n const agentTools = agentToolsData?.data || [];\n const allTools = toolsData?.data || [];\n const previewText = buildPreview(promptText, objectives, agentTools, allTools);\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 {/* Editor section */}\n <div className=\"min-w-0 flex-1 space-y-4\">\n {/* Textarea */}\n <div className=\"space-y-2\">\n <textarea\n ref={textareaRef}\n aria-label=\"Prompt do sistema\"\n name=\"prompt\"\n value={promptText}\n onChange={(e) => setPromptText(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Escreva o prompt do sistema aqui\\u2026\"\n disabled={updateAgent.isPending}\n className=\"w-full resize-none rounded-lg border bg-background p-3 font-mono text-sm leading-relaxed focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-50\"\n style={{ minHeight: \"300px\" }}\n />\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 {/* Save row */}\n <div className=\"flex items-center gap-3\">\n <Input\n aria-label=\"Notas da alteração\"\n name=\"changeNotes\"\n value={changeNotes}\n onChange={(e) => setChangeNotes(e.target.value)}\n placeholder=\"O que mudou? (opcional)\"\n disabled={updateAgent.isPending}\n className=\"flex-1\"\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleSave();\n }\n }}\n />\n <Button\n onClick={handleSave}\n disabled={updateAgent.isPending || !promptText.trim()}\n >\n {updateAgent.isPending && (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n )}\n Salvar\n </Button>\n </div>\n\n {/* Preview section */}\n <div className=\"rounded-lg border\">\n <button\n type=\"button\"\n onClick={() => setShowPreview((prev) => !prev)}\n className=\"flex w-full items-center justify-between px-4 py-3 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors\"\n >\n <span>Preview do prompt final</span>\n {showPreview ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronDown className=\"h-4 w-4\" />\n )}\n </button>\n {showPreview && (\n <div className=\"border-t px-4 py-3\">\n <pre className=\"max-h-96 overflow-auto whitespace-pre-wrap font-mono text-sm leading-relaxed\">\n {previewText.split(\"\\n\").map((line, i) => {\n const isSection =\n line.startsWith(\"[SKILLS DISPONÍVEIS]\") ||\n line.startsWith(\"[TOOLS DISPONÍVEIS]\");\n return (\n <span\n key={i}\n className={isSection ? \"font-semibold text-muted-foreground\" : \"\"}\n >\n {line}\n {\"\\n\"}\n </span>\n );\n })}\n </pre>\n </div>\n )}\n </div>\n\n {/* Diff panel (when comparing) */}\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 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 {/* Timeline section (right) */}\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. Salve o prompt para criar a primeira versão.\n </p>\n </div>\n ) : (\n <div className=\"space-y-1\">\n {sortedVersions.map((version, idx) => {\n const isCurrent = idx === 0;\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 </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 } from \"react\";\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 type { IntegrationCardData } from \"../hooks/use-integrations\";\nimport type { WizardIntegrationMeta } from \"../components/capabilities/types\";\nimport { CapabilitiesTab } from \"../components/capabilities/capabilities-tab\";\nimport { IntegrationsTab } from \"../components/capabilities/integrations-tab\";\nimport { IntegrationWizard } from \"../components/capabilities/integration-wizard\";\nimport { AdvancedTab } from \"../components/capabilities/advanced-tab\";\nimport type { ConfigOption } from \"../components/capabilities/wizard-steps/config-step\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface AgentCapabilitiesPageProps {\n config: GagentsHookConfig;\n agentId: number;\n gagentsApiUrl: string;\n /**\n * Resolve wizard metadata for a given integration card.\n * The consuming app provides this so the wizard gets correct\n * capabilities, requirements, and config step flag.\n */\n resolveWizardMeta?: (card: IntegrationCardData) => WizardIntegrationMeta;\n /**\n * Callback to load config options after OAuth completes\n * (e.g. load Google Calendar list). Forwarded to IntegrationWizard.\n */\n loadConfigOptions?: (credentialId: number) => Promise<ConfigOption[]>;\n /** Called after wizard completes successfully. */\n onWizardComplete?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Default wizard meta resolver\n// ---------------------------------------------------------------------------\n\nfunction defaultResolveWizardMeta(card: IntegrationCardData): WizardIntegrationMeta {\n return {\n capabilities: [\n { label: card.definition.name, description: card.definition.description },\n ],\n requirements: [],\n hasConfigStep: false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function AgentCapabilitiesPage({\n config,\n agentId,\n gagentsApiUrl,\n resolveWizardMeta = defaultResolveWizardMeta,\n loadConfigOptions,\n onWizardComplete,\n}: AgentCapabilitiesPageProps) {\n // Wizard dialog state\n const [wizardOpen, setWizardOpen] = useState(false);\n const [activeCard, setActiveCard] = useState<IntegrationCardData | null>(null);\n\n const handleConnect = useCallback(\n (card: IntegrationCardData) => {\n setActiveCard(card);\n setWizardOpen(true);\n },\n [],\n );\n\n const handleWizardComplete = useCallback(() => {\n setWizardOpen(false);\n setActiveCard(null);\n onWizardComplete?.();\n }, [onWizardComplete]);\n\n const handleWizardOpenChange = useCallback((open: boolean) => {\n setWizardOpen(open);\n if (!open) setActiveCard(null);\n }, []);\n\n // Derive wizard meta from active card\n const wizardMeta = activeCard ? resolveWizardMeta(activeCard) : null;\n\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 serviços externos 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\n config={config}\n agentId={agentId}\n onConnect={handleConnect}\n />\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\n {/* Integration Wizard Dialog */}\n {activeCard && wizardMeta && (\n <IntegrationWizard\n open={wizardOpen}\n onOpenChange={handleWizardOpenChange}\n integration={activeCard.definition}\n meta={wizardMeta}\n agentId={agentId}\n config={config}\n onComplete={handleWizardComplete}\n gagentsApiUrl={gagentsApiUrl}\n existingCredentialId={activeCard.credential?.id}\n loadConfigOptions={loadConfigOptions}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useRef, 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 Calendar,\n Users,\n Settings,\n HeartHandshake,\n Package,\n ChevronDown,\n} from \"lucide-react\";\nimport { toast } from \"sonner\";\n\n// ---------------------------------------------------------------------------\n// Operation label mapping (pt-BR)\n// ---------------------------------------------------------------------------\n\nconst OPERATION_LABELS: Record<string, string> = {\n list: \"Listar\",\n view: \"Visualizar\",\n create: \"Criar\",\n update: \"Atualizar\",\n};\n\nfunction getOperationLabel(slug: string): string {\n return OPERATION_LABELS[slug] ?? slug;\n}\n\n// ---------------------------------------------------------------------------\n// Category icon mapping\n// ---------------------------------------------------------------------------\n\nconst CATEGORY_ICONS: Record<string, React.ElementType> = {\n agenda: Calendar,\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\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 stateToPayload(state: CapabilityState): AgentCapabilitiesPayload {\n const capabilities: AgentCapability[] = [];\n state.forEach((ops, mod) => {\n if (ops.size > 0) {\n capabilities.push({ module: mod, operations: Array.from(ops) });\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 statesEqual(a: CapabilityState, b: CapabilityState): boolean {\n if (a.size !== b.size) return false;\n for (const [mod, opsA] of a) {\n const opsB = b.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\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 [initialized, setInitialized] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Sync server data into local state on first load / refetch\n useEffect(() => {\n if (agentCaps && !initialized) {\n const state = buildStateFromAgent(agentCaps);\n setLocalState(state);\n setServerState(cloneState(state));\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 () => initialized && !statesEqual(localState, serverState),\n [localState, serverState, initialized],\n );\n\n // ------ Debounced save ------\n const scheduleSave = useCallback(\n (nextState: CapabilityState) => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n const payload = stateToPayload(nextState);\n updateMutation.mutate(\n { agentId, payload },\n {\n onSuccess: () => {\n setServerState(cloneState(nextState));\n toast.success(\"Capacidades salvas\");\n },\n onError: () => {\n // Rollback to server state\n setLocalState(cloneState(serverState));\n toast.error(\"Erro ao salvar capacidades\");\n },\n },\n );\n }, 500);\n },\n [agentId, updateMutation, serverState],\n );\n\n // ------ State mutation helpers ------\n const updateState = useCallback(\n (updater: (prev: CapabilityState) => CapabilityState) => {\n setLocalState((prev) => {\n const next = updater(prev);\n scheduleSave(next);\n return next;\n });\n },\n [scheduleSave],\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 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 if (debounceRef.current) clearTimeout(debounceRef.current);\n setLocalState(cloneState(serverState));\n }, [serverState]);\n\n const saveNow = useCallback(() => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n const payload = stateToPayload(localState);\n updateMutation.mutate(\n { agentId, payload },\n {\n onSuccess: () => {\n setServerState(cloneState(localState));\n toast.success(\"Capacidades salvas\");\n },\n onError: () => {\n setLocalState(cloneState(serverState));\n toast.error(\"Erro ao salvar capacidades\");\n },\n },\n );\n }, [agentId, localState, serverState, 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\n return (\n <ModuleRow\n key={mod.slug}\n module={mod}\n isOn={isModuleOn}\n allOpsEnabled={allOpsEnabled}\n enabledOps={enabledOps ?? new Set()}\n onToggleModule={(on) => toggleModule(mod, on)}\n onToggleOperation={(op, on) =>\n toggleOperation(mod, op, on)\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 bg-background border-t py-3 px-4 -mx-4 flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">\n Você tem alterações não salvas.\n </span>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={discard}>\n Descartar\n </Button>\n <Button\n size=\"sm\"\n onClick={saveNow}\n disabled={updateMutation.isPending}\n >\n {updateMutation.isPending ? \"Salvando...\" : \"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 onToggleModule: (on: boolean) => void;\n onToggleOperation: (op: string, on: boolean) => void;\n}\n\nfunction ModuleRow({\n module: mod,\n isOn,\n enabledOps,\n onToggleModule,\n onToggleOperation,\n}: ModuleRowProps) {\n const [expanded, setExpanded] = useState(false);\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 flex flex-wrap gap-x-5 gap-y-1.5 pb-1\">\n {mod.operations.map((op) => {\n const checked = enabledOps.has(op);\n return (\n <label\n key={op}\n className=\"flex items-center gap-1.5 text-sm cursor-pointer\"\n >\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={checked ? \"\" : \"text-muted-foreground\"}>\n {getOperationLabel(op)}\n </span>\n </label>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { IntegrationCardData, IntegrationCardState } from \"../../hooks/use-integrations\";\nimport { Badge, Button, Tooltip, TooltipContent, TooltipTrigger } from \"@greatapps/greatauth-ui/ui\";\nimport {\n CalendarSync,\n Plug,\n Settings,\n RefreshCw,\n Users,\n Clock,\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 Users,\n Clock,\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\nfunction getActionLabel(state: IntegrationCardState): string {\n switch (state) {\n case \"available\":\n return \"Conectar\";\n case \"connected\":\n return \"Configurar\";\n case \"expired\":\n return \"Reconectar\";\n default:\n return \"\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationCardProps {\n card: IntegrationCardData;\n onConnect: (card: IntegrationCardData) => void;\n}\n\nexport function IntegrationCard({ card, onConnect }: IntegrationCardProps) {\n const { definition, state, sharedByAgentsCount } = card;\n const Icon = resolveIcon(definition.icon);\n const badge = STATE_BADGES[state];\n const actionLabel = getActionLabel(state);\n const isComingSoon = state === \"coming_soon\";\n\n return (\n <div\n className={cn(\n \"group relative flex flex-col gap-3 rounded-xl border bg-card p-5 transition-shadow\",\n isComingSoon\n ? \"opacity-60 cursor-default\"\n : \"hover:shadow-md cursor-pointer\",\n )}\n role=\"button\"\n tabIndex={isComingSoon ? -1 : 0}\n aria-label={`${definition.name} — ${badge.label}`}\n aria-disabled={isComingSoon}\n onClick={() => !isComingSoon && onConnect(card)}\n onKeyDown={(e) => {\n if (!isComingSoon && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n onConnect(card);\n }\n }}\n >\n {/* Header row */}\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\n {/* Name + description */}\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\n {/* Footer */}\n <div className=\"mt-auto flex items-center justify-between gap-2 pt-1\">\n {sharedByAgentsCount > 0 ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex items-center gap-1 text-xs text-blue-600 dark:text-blue-400\">\n <Users className=\"h-3.5 w-3.5\" />\n Compartilhada\n </span>\n </TooltipTrigger>\n <TooltipContent>\n Esta credencial está disponível para todos os agentes da conta\n </TooltipContent>\n </Tooltip>\n ) : (\n <span />\n )}\n\n {!isComingSoon && (\n <Button\n variant={state === \"expired\" ? \"destructive\" : \"outline\"}\n size=\"sm\"\n className=\"text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onConnect(card);\n }}\n >\n {actionLabel}\n </Button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useIntegrationState, type IntegrationCardData } from \"../../hooks/use-integrations\";\nimport { IntegrationCard } from \"./integration-card\";\nimport { Plug, Loader2 } from \"lucide-react\";\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface IntegrationsTabProps {\n config: GagentsHookConfig;\n agentId: number | null;\n /** Called when user clicks a card action (connect / configure / reconnect).\n * The consuming app wires this to the wizard (Story 18.9). */\n onConnect: (card: IntegrationCardData) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function IntegrationsTab({\n config,\n agentId,\n onConnect,\n}: IntegrationsTabProps) {\n const { cards, isLoading } = useIntegrationState(config, agentId);\n\n // Loading state\n if (isLoading) {\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\n if (cards.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\">Nenhuma integração disponível</p>\n </div>\n );\n }\n\n return (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {cards.map((card) => (\n <IntegrationCard\n key={card.definition.slug}\n card={card}\n onConnect={onConnect}\n />\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 const response = await fetch(\n `${gagentsApiUrl}/v1/${language}/${idWl}/accounts/${accountId}/oauth/authorize/${integration.slug}`,\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 // via the onComplete callback.\n\n onComplete();\n onOpenChange(false);\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 &quot;Concluir&quot; 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","'use client';\n\nimport { useState } from \"react\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport { useToolCredentials } from \"../../hooks\";\nimport { ToolsTable } from \"../tools/tools-table\";\nimport { ToolCredentialsForm } from \"../tools/tool-credentials-form\";\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 { data: credentialsData, isLoading: isLoadingCredentials } =\n useToolCredentials(config);\n const credentials = credentialsData?.data ?? [];\n\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 e credenciais.\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 {/* Credenciais section */}\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-medium\">Credenciais</h3>\n <ToolCredentialsForm\n credentials={credentials}\n isLoading={isLoadingCredentials}\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n />\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","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 { 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 useCreateToolCredential,\n useUpdateToolCredential,\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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Trash2, Pencil, Link, 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 createOpen?: boolean;\n onCreateOpenChange?: (open: boolean) => void;\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 onEdit: (cred: ToolCredential) => void,\n onConnect: (cred: ToolCredential) => void,\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 function getToolType(idTool: number | null): string | null {\n if (!idTool) return null;\n const tool = tools.find((t) => t.id === idTool);\n return tool?.type || null;\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 {getToolType(row.original.id_tool) === \"oauth2\" && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label=\"Vincular\"\n disabled\n >\n <Link className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Em breve</TooltipContent>\n </Tooltip>\n )}\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={() => 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 createOpen: externalCreateOpen,\n onCreateOpenChange,\n}: ToolCredentialsFormProps) {\n const createMutation = useCreateToolCredential(config);\n const updateMutation = useUpdateToolCredential(config);\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 [internalCreateOpen, setInternalCreateOpen] = useState(false);\n const showCreateDialog = externalCreateOpen ?? internalCreateOpen;\n const setShowCreateDialog = onCreateOpenChange ?? setInternalCreateOpen;\n const [createForm, setCreateForm] = useState({\n id_tool: \"\",\n label: \"\",\n credentials_encrypted: \"\",\n expires_at: \"\",\n });\n\n const [editTarget, setEditTarget] = useState<ToolCredential | null>(null);\n const [editForm, setEditForm] = useState({\n id_tool: \"\",\n label: \"\",\n credentials_encrypted: \"\",\n expires_at: \"\",\n status: \"\" as \"active\" | \"expired\" | \"\",\n });\n\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) => startEdit(cred),\n (cred) => handleConnect(cred),\n (cred) => setRemoveTarget(cred),\n );\n\n async function handleCreate() {\n const idTool = parseInt(createForm.id_tool, 10);\n if (!idTool || !createForm.label.trim() || !createForm.credentials_encrypted.trim()) return;\n\n try {\n const result = await createMutation.mutateAsync({\n id_tool: idTool,\n label: createForm.label.trim(),\n credentials_encrypted: createForm.credentials_encrypted.trim(),\n ...(createForm.expires_at ? { expires_at: createForm.expires_at } : {}),\n });\n if (result.status === 1) {\n toast.success(\"Credencial criada\");\n setShowCreateDialog(false);\n setCreateForm({ id_tool: \"\", label: \"\", credentials_encrypted: \"\", expires_at: \"\" });\n } else {\n toast.error(result.message || \"Erro ao criar credencial\");\n }\n } catch {\n toast.error(\"Erro ao criar credencial\");\n }\n }\n\n function startEdit(cred: ToolCredential) {\n setEditTarget(cred);\n setEditForm({\n id_tool: cred.id_tool ? String(cred.id_tool) : \"\",\n label: cred.label || \"\",\n credentials_encrypted: \"\",\n expires_at: cred.expires_at || \"\",\n status: cred.status,\n });\n }\n\n async function handleSaveEdit() {\n if (!editTarget) return;\n const body: Record<string, unknown> = {};\n const newIdTool = editForm.id_tool ? parseInt(editForm.id_tool, 10) : null;\n if (newIdTool && newIdTool !== editTarget.id_tool) {\n body.id_tool = newIdTool;\n }\n if (editForm.label.trim() && editForm.label.trim() !== (editTarget.label || \"\")) {\n body.label = editForm.label.trim();\n }\n if (editForm.credentials_encrypted.trim()) {\n body.credentials_encrypted = editForm.credentials_encrypted.trim();\n }\n if (editForm.expires_at !== (editTarget.expires_at || \"\")) {\n body.expires_at = editForm.expires_at || null;\n }\n if (editForm.status && editForm.status !== editTarget.status) {\n body.status = editForm.status;\n }\n\n if (Object.keys(body).length === 0) {\n setEditTarget(null);\n return;\n }\n\n try {\n const result = await updateMutation.mutateAsync({\n id: editTarget.id,\n body: body as Parameters<typeof updateMutation.mutateAsync>[0][\"body\"],\n });\n if (result.status === 1) {\n toast.success(\"Credencial atualizada\");\n setEditTarget(null);\n } else {\n toast.error(result.message || \"Erro ao atualizar credencial\");\n }\n } catch {\n toast.error(\"Erro ao atualizar credencial\");\n }\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 function handleConnect(cred: ToolCredential) {\n if (!config.accountId || !config.token) return;\n const language = config.language ?? \"pt-br\";\n const idWl = config.idWl ?? 1;\n const url = `${gagentsApiUrl}/v1/${language}/${idWl}/accounts/${config.accountId}/oauth/connect?id_tool=${cred.id_tool}`;\n window.open(url, \"_blank\");\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 {/* Create Dialog */}\n <Dialog open={showCreateDialog} onOpenChange={setShowCreateDialog}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Nova Credencial</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"cred-tool\" className=\"mb-1 block text-sm font-medium\">\n Ferramenta *\n </label>\n <Select\n value={createForm.id_tool}\n onValueChange={(val) =>\n setCreateForm((f) => ({ ...f, id_tool: val }))\n }\n >\n <SelectTrigger id=\"cred-tool\">\n <SelectValue placeholder=\"Selecione a ferramenta\" />\n </SelectTrigger>\n <SelectContent>\n {tools.map((tool) => (\n <SelectItem key={tool.id} value={String(tool.id)}>\n {tool.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label htmlFor=\"cred-label\" className=\"mb-1 block text-sm font-medium\">\n Label *\n </label>\n <Input\n id=\"cred-label\"\n name=\"label\"\n value={createForm.label}\n onChange={(e) =>\n setCreateForm((f) => ({ ...f, label: e.target.value }))\n }\n placeholder=\"Ex: Google Calendar - Clínica São Paulo\"\n />\n </div>\n <div>\n <label htmlFor=\"cred-credential\" className=\"mb-1 block text-sm font-medium\">\n Credencial *\n </label>\n <Input\n id=\"cred-credential\"\n name=\"credential\"\n autoComplete=\"off\"\n type=\"password\"\n value={createForm.credentials_encrypted}\n onChange={(e) =>\n setCreateForm((f) => ({\n ...f,\n credentials_encrypted: e.target.value,\n }))\n }\n placeholder=\"Credencial encriptada\"\n />\n </div>\n <div>\n <label htmlFor=\"cred-expires\" className=\"mb-1 block text-sm font-medium\">\n Data de Expiração (opcional)\n </label>\n <Input\n id=\"cred-expires\"\n name=\"expires\"\n type=\"date\"\n value={createForm.expires_at}\n onChange={(e) =>\n setCreateForm((f) => ({ ...f, expires_at: e.target.value }))\n }\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n variant=\"outline\"\n onClick={() => setShowCreateDialog(false)}\n >\n Cancelar\n </Button>\n <Button\n onClick={handleCreate}\n disabled={\n !createForm.id_tool ||\n !createForm.label.trim() ||\n !createForm.credentials_encrypted.trim() ||\n createMutation.isPending\n }\n >\n Criar\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Edit Dialog */}\n <Dialog\n open={!!editTarget}\n onOpenChange={(open) => !open && setEditTarget(null)}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Editar Credencial</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <div>\n <label htmlFor=\"edit-cred-tool\" className=\"mb-1 block text-sm font-medium\">\n Ferramenta *\n </label>\n <Select\n value={editForm.id_tool}\n onValueChange={(val) =>\n setEditForm((f) => ({ ...f, id_tool: val }))\n }\n >\n <SelectTrigger id=\"edit-cred-tool\">\n <SelectValue placeholder=\"Selecione a ferramenta\" />\n </SelectTrigger>\n <SelectContent>\n {tools.map((tool) => (\n <SelectItem key={tool.id} value={String(tool.id)}>\n {tool.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div>\n <label htmlFor=\"edit-cred-label\" className=\"mb-1 block text-sm font-medium\">\n Label\n </label>\n <Input\n id=\"edit-cred-label\"\n name=\"label\"\n value={editForm.label}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, label: e.target.value }))\n }\n placeholder=\"Label da credencial\"\n />\n </div>\n <div>\n <label htmlFor=\"edit-cred-credential\" className=\"mb-1 block text-sm font-medium\">\n Nova Credencial (vazio = manter atual)\n </label>\n <Input\n id=\"edit-cred-credential\"\n name=\"credential\"\n autoComplete=\"off\"\n type=\"password\"\n value={editForm.credentials_encrypted}\n onChange={(e) =>\n setEditForm((f) => ({\n ...f,\n credentials_encrypted: e.target.value,\n }))\n }\n placeholder=\"Nova credencial\"\n />\n </div>\n <div>\n <label htmlFor=\"edit-cred-expires\" className=\"mb-1 block text-sm font-medium\">\n Data de Expiração\n </label>\n <Input\n id=\"edit-cred-expires\"\n name=\"expires\"\n type=\"date\"\n value={editForm.expires_at}\n onChange={(e) =>\n setEditForm((f) => ({ ...f, expires_at: e.target.value }))\n }\n />\n </div>\n <div>\n <label htmlFor=\"edit-cred-status\" className=\"mb-1 block text-sm font-medium\">Status</label>\n <Select\n value={editForm.status || undefined}\n onValueChange={(val) =>\n setEditForm((f) => ({\n ...f,\n status: val as \"active\" | \"expired\",\n }))\n }\n >\n <SelectTrigger id=\"edit-cred-status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"active\">Ativo</SelectItem>\n <SelectItem value=\"expired\">Expirado</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setEditTarget(null)}>\n Cancelar\n </Button>\n <Button\n onClick={handleSaveEdit}\n disabled={updateMutation.isPending}\n >\n Salvar\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\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","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 type { Agent } from \"../../types\";\nimport type { GagentsHookConfig } from \"../../hooks/types\";\nimport type { IntegrationCardData } from \"../../hooks/use-integrations\";\nimport type { WizardIntegrationMeta } from \"../capabilities/types\";\nimport type { ConfigOption } from \"../capabilities/wizard-steps/config-step\";\nimport { AgentObjectivesList } from \"./agent-objectives-list\";\nimport { AgentPromptEditor } from \"./agent-prompt-editor\";\nimport { AgentConversationsPanel } from \"../conversations/agent-conversations-panel\";\nimport { AgentCapabilitiesPage } from \"../../pages/agent-capabilities-page\";\nimport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Target, FileText, MessageCircle, Blocks } from \"lucide-react\";\n\ninterface AgentTabsProps {\n agent: Agent;\n config: GagentsHookConfig;\n renderChatLink?: (inboxId: number) => React.ReactNode;\n /** Required for the Capacidades tab — gagents API URL for OAuth flows and advanced features. Falls back to config.baseUrl. */\n gagentsApiUrl?: string;\n /** Resolve wizard metadata for a given integration card. */\n resolveWizardMeta?: (card: IntegrationCardData) => WizardIntegrationMeta;\n /** Callback to load config options after OAuth completes. */\n loadConfigOptions?: (credentialId: number) => Promise<ConfigOption[]>;\n /** Called after wizard completes successfully. */\n onWizardComplete?: () => void;\n}\n\nexport function AgentTabs({\n agent,\n config,\n renderChatLink,\n gagentsApiUrl,\n resolveWizardMeta,\n loadConfigOptions,\n onWizardComplete,\n}: AgentTabsProps) {\n const apiUrl = gagentsApiUrl || config.baseUrl;\n\n return (\n <Tabs defaultValue=\"prompt\">\n <TabsList>\n <TabsTrigger value=\"prompt\" className=\"flex items-center gap-1.5\">\n <FileText aria-hidden=\"true\" className=\"h-3.5 w-3.5\" />\n Prompt\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=\"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 </TabsList>\n\n <TabsContent value=\"prompt\" className=\"mt-4\">\n <AgentPromptEditor 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 <AgentCapabilitiesPage\n config={config}\n agentId={agent.id}\n gagentsApiUrl={apiUrl}\n resolveWizardMeta={resolveWizardMeta}\n loadConfigOptions={loadConfigOptions}\n onWizardComplete={onWizardComplete}\n />\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 </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 &apos;Adicionar Ferramenta&apos; 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 { 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","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 { useState } from \"react\";\nimport { useToolCredentials } from \"../hooks\";\nimport { ToolCredentialsForm } from \"../components/tools/tool-credentials-form\";\nimport { Button } from \"@greatapps/greatauth-ui/ui\";\nimport { Plus } from \"lucide-react\";\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 const [createOpen, setCreateOpen] = useState(false);\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 <Button onClick={() => setCreateOpen(true)} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Nova Credencial\n </Button>\n </div>\n\n <ToolCredentialsForm\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n credentials={credentials}\n isLoading={credentialsLoading}\n createOpen={createOpen}\n onCreateOpenChange={setCreateOpen}\n />\n </div>\n );\n}\n","'use client';\n\nimport { useState, useMemo } from \"react\";\nimport { useToolCredentials, useAgents, useTools } from \"../hooks\";\nimport { ToolCredentialsForm } from \"../components/tools/tool-credentials-form\";\nimport { IntegrationsTab } from \"../components/capabilities/integrations-tab\";\nimport {\n Badge,\n Button,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@greatapps/greatauth-ui/ui\";\nimport { Plus, Plug, KeyRound, Info } from \"lucide-react\";\nimport type { GagentsHookConfig } from \"../hooks/types\";\nimport type { IntegrationCardData } from \"../hooks/use-integrations\";\nimport type { Agent, Tool, ToolCredential } from \"../types\";\n\nexport interface IntegrationsManagementPageProps {\n config: GagentsHookConfig;\n gagentsApiUrl: string;\n /** Called when user clicks connect/reconnect on an integration card. */\n onConnect?: (card: IntegrationCardData) => void;\n title?: string;\n subtitle?: string;\n}\n\n/**\n * Build a map of credential id → list of agent names that use it.\n * Cross-references tools (which link credential via id) with agents\n * that have agent_tools referencing those tools.\n *\n * Since we don't have an account-level agent_tools endpoint, we\n * approximate by checking which tools are linked to credentials and\n * showing credential-level stats.\n */\nfunction useCredentialAgentSummary(\n credentials: ToolCredential[],\n tools: Tool[],\n agents: Agent[],\n) {\n return useMemo(() => {\n // Build a set of tool IDs that have credentials\n const toolIdsWithCredentials = new Set(\n credentials.map((c) => c.id_tool).filter(Boolean),\n );\n\n // Count how many credentials are linked to tools that agents could use\n const linkedCount = credentials.filter(\n (c) => c.id_tool && toolIdsWithCredentials.has(c.id_tool),\n ).length;\n\n return {\n totalCredentials: credentials.length,\n linkedToTools: linkedCount,\n totalAgents: agents.length,\n totalTools: tools.length,\n };\n }, [credentials, tools, agents]);\n}\n\nexport function IntegrationsManagementPage({\n config,\n gagentsApiUrl,\n onConnect,\n title = \"Integrações e Credenciais\",\n subtitle = \"Gerencie todas as integrações e credenciais da conta.\",\n}: IntegrationsManagementPageProps) {\n const { data: credentialsData, isLoading: credentialsLoading } =\n useToolCredentials(config);\n const { data: agentsData } = useAgents(config);\n const { data: toolsData } = useTools(config);\n const [createOpen, setCreateOpen] = useState(false);\n\n const credentials = credentialsData?.data || [];\n const agents: Agent[] = agentsData?.data || [];\n const tools: Tool[] = toolsData?.data || [];\n\n const summary = useCredentialAgentSummary(credentials, tools, agents);\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 <Tabs defaultValue=\"integrations\" className=\"w-full\">\n <TabsList>\n <TabsTrigger value=\"integrations\" className=\"gap-2\">\n <Plug className=\"h-4 w-4\" />\n Integrações\n </TabsTrigger>\n <TabsTrigger value=\"credentials\" className=\"gap-2\">\n <KeyRound className=\"h-4 w-4\" />\n Credenciais\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"integrations\" className=\"mt-4\">\n <IntegrationsTab\n config={config}\n agentId={null}\n onConnect={onConnect ?? (() => {})}\n />\n </TabsContent>\n\n <TabsContent value=\"credentials\" className=\"mt-4\">\n {/* Summary bar */}\n {!credentialsLoading && (\n <div className=\"flex items-center gap-4 rounded-lg border bg-muted/50 px-4 py-3 mb-4\">\n <Info className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"flex flex-wrap items-center gap-3 text-sm\">\n <span>\n <Badge variant=\"secondary\" className=\"mr-1\">\n {summary.totalCredentials}\n </Badge>\n {summary.totalCredentials === 1\n ? \"credencial configurada\"\n : \"credenciais configuradas\"}\n </span>\n <span className=\"text-muted-foreground\">|</span>\n <span>\n <Badge variant=\"secondary\" className=\"mr-1\">\n {summary.linkedToTools}\n </Badge>\n {summary.linkedToTools === 1\n ? \"vinculada a ferramentas\"\n : \"vinculadas a ferramentas\"}\n </span>\n <span className=\"text-muted-foreground\">|</span>\n <span>\n <Badge variant=\"secondary\" className=\"mr-1\">\n {summary.totalAgents}\n </Badge>\n {summary.totalAgents === 1\n ? \"agente na conta\"\n : \"agentes na conta\"}\n </span>\n </div>\n </div>\n )}\n\n <div className=\"flex items-center justify-end mb-4\">\n <Button onClick={() => setCreateOpen(true)} size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Nova Credencial\n </Button>\n </div>\n\n <ToolCredentialsForm\n config={config}\n gagentsApiUrl={gagentsApiUrl}\n credentials={credentials}\n isLoading={credentialsLoading}\n createOpen={createOpen}\n onCreateOpenChange={setCreateOpen}\n />\n </TabsContent>\n </Tabs>\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","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Loader2","toast","ImageCropUpload","jsx","jsxs","msToSeconds","secondsToMs","agentToFormState","useState","useEffect","useState","Input","Button","Switch","Label","Badge","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","React","jsx","Trash2","Pencil","toast","jsx","jsxs","useState","Button","Badge","Switch","Dialog","DialogContent","DialogHeader","DialogTitle","Label","Input","DialogFooter","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","useState","useCallback","useEffect","Button","Input","Skeleton","Badge","Loader2","toast","jsx","jsxs","useState","useCallback","useEffect","useState","Skeleton","Badge","Skeleton","Button","jsx","jsxs","jsx","jsxs","useState","Skeleton","Badge","jsx","useState","useCallback","Plug","Settings","useState","useCallback","useRef","useEffect","useMemo","Switch","Badge","Button","Skeleton","ChevronDown","toast","jsx","jsxs","useState","useRef","useEffect","useMemo","useCallback","Badge","Button","Tooltip","TooltipContent","TooltipTrigger","Settings","Users","jsx","jsxs","Settings","Users","Badge","Tooltip","TooltipTrigger","TooltipContent","Button","Plug","Loader2","jsx","jsxs","useCallback","useEffect","useRef","useState","Dialog","DialogContent","DialogFooter","DialogHeader","DialogTitle","Button","Loader2","Check","toast","jsx","jsxs","Loader2","Button","Input","Label","jsx","jsxs","Loader2","Label","jsx","jsxs","CheckCircle2","Label","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","toast","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Loader2","Check","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","useMemo","useState","DataTable","Input","Button","Badge","Tooltip","TooltipTrigger","TooltipContent","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Trash2","Pencil","Search","format","ptBR","toast","jsx","jsxs","formatDate","useColumns","useState","useMemo","useState","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Button","Input","Textarea","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Loader2","toast","jsx","jsxs","slugify","useState","Info","jsx","jsxs","useState","jsx","jsxs","useState","useCallback","Plug","Settings","Tabs","TabsList","TabsTrigger","TabsContent","Target","FileText","MessageCircle","Blocks","jsx","jsxs","useState","Switch","Badge","Button","Skeleton","AlertDialog","AlertDialogAction","AlertDialogCancel","AlertDialogContent","AlertDialogDescription","AlertDialogFooter","AlertDialogHeader","AlertDialogTitle","Input","Textarea","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","Label","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","Trash2","Plus","Settings2","toast","jsx","jsxs","useState","useState","Button","Plus","jsx","jsxs","useState","useState","Badge","Button","Skeleton","EntityAvatar","Pencil","jsx","jsxs","useState","useState","Button","Plus","jsx","jsxs","useState","useState","Button","Plus","jsx","jsxs","useState","useState","useMemo","Badge","Button","Tabs","TabsContent","TabsList","TabsTrigger","Plus","Plug","Info","jsx","jsxs","useMemo","useState"]}