@fayz-ai/plugin-automations 0.12.2 → 0.12.3
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
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React4 from 'react';
|
|
2
2
|
import React4__default from 'react';
|
|
3
|
-
import { getSupabaseClientOptional, startEventLog, getMessageDefaults, normalizeMessageActions, usePluginRuntimeOptional, resolveMessages, resolveMessage, renderMessageTemplate, loadEventRuns, getActiveTenantId } from '@fayz-ai/core';
|
|
3
|
+
import { getSupabaseClientOptional, startEventLog, getMessageDefaults, normalizeMessageActions, usePluginRuntimeOptional, resolveMessages, errorMessage, resolveMessage, renderMessageTemplate, loadEventRuns, getActiveTenantId } from '@fayz-ai/core';
|
|
4
4
|
import { resolveFayzAgentConnection, registerRailPage, getFayzSupabaseClientOptional, useConnectors, useAgentSurface, PageActions, askAI, SettingsTabs, adminNavigateTo, RightRailPage, AskAIButton, useOrganizationStore, connectorRoute, ConnectorMark, ConnectorDeliveries } from '@fayz-ai/admin';
|
|
5
5
|
import * as LucideIcons from 'lucide-react';
|
|
6
6
|
import { WandSparkles, Zap, Receipt, Megaphone, MessageSquare, Smartphone, Mail, ChevronRight, RotateCcw, Check, Clock, Monitor, RefreshCw, History, Send, AlertTriangle, CircleCheck, CircleSlash } from 'lucide-react';
|
|
@@ -1294,7 +1294,7 @@ function AutomationsList({ store, variant = "page", basePath = "/automations" })
|
|
|
1294
1294
|
}
|
|
1295
1295
|
};
|
|
1296
1296
|
} catch (e) {
|
|
1297
|
-
return { ok: false, error:
|
|
1297
|
+
return { ok: false, error: errorMessage(e) };
|
|
1298
1298
|
}
|
|
1299
1299
|
}
|
|
1300
1300
|
}]
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/payment-preflight.ts","../src/data/test-send.ts","../src/lib/runtime.ts","../src/data/fayz.ts","../src/views/RunLog.tsx","../src/views/whatsapp-preview-bg.ts","../src/data/provider-templates.ts","../src/views/ProviderTemplateStatus.tsx","../src/views/AutomationDetailPage.tsx","../src/lib/connector-automations.ts","../src/views/ConnectorAutomations.tsx","../src/views/AutomationsList.tsx","../src/data/templates.ts","../src/index.ts"],"names":["React","getSupabaseClientOptional","getActiveTenantId","row","jsxs","jsx","Badge","Button","current","Card","Fragment","adminNavigateTo","ChevronRight","CHANNEL_ICON","Mail","WhatsAppIcon","Smartphone","MessageSquare","CHANNEL_LABEL","Zap","usePluginRuntimeOptional","useAgentSurface","toast","Switch","resolveFayzAgentConnection"],"mappings":"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","file":"index.js","sourcesContent":["// \"Can this app take a Pix?\" — asked here so the editor does not offer a button\n// that would produce a charge nobody can open.\n//\n// ── Why this is a second copy ───────────────────────────────────────────────\n// The function is `tyxter-payment-preflight`, it is OWNED by plugin-conversations\n// (which ships its source and declares it in its manifest), and that plugin\n// exports a richer reader of the same answer. This is not that reader, because\n// plugins in this repo do not depend on one another — there is no\n// @fayz-ai/plugin-conversations in this package.json and adding one would make\n// the automations screen refuse to build in an app that installs automations\n// without the inbox.\n//\n// So the shared thing is the FUNCTION, and the duplicated thing is one invoke.\n// The half that could drift — what \"ready\" means, which modes count — is the\n// function's answer, not this file's opinion.\n//\n// Absence is not failure: an app with no WhatsApp connector at all gets a null\n// readiness, and the editor shows the pay action disabled with a reason rather\n// than an error.\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport * as React from 'react'\n\nconst PREFLIGHT_FUNCTION = 'tyxter-payment-preflight'\n\nexport interface PaymentReadiness {\n ready: boolean\n status: string\n /** 'abacate_pay' is production; 'sandbox_default' works end to end with money\n * that is not real; null means nothing is selected behind the channel. */\n mode: string | null\n sandbox: boolean\n reason: string | null\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (name: string, options: { body: unknown }) => Promise<{ data: unknown; error: unknown }>\n }\n}\n\nasync function readReadiness(): Promise<PaymentReadiness | null> {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n const tenantId = getActiveTenantId()\n if (!supabase || !tenantId) return null\n const { data, error } = await supabase.functions.invoke(PREFLIGHT_FUNCTION, {\n body: { action: 'status', tenantId },\n })\n if (error) return null\n const payments = (data as { payments?: PaymentReadiness } | null)?.payments\n return payments ?? null\n}\n\n/** Ready AND with a rail actually selected. See PaymentReadiness.mode. */\nexport function canOfferPayment(readiness: PaymentReadiness | null): boolean {\n return Boolean(readiness?.ready) && readiness?.mode !== null && readiness?.mode !== undefined\n}\n\n/**\n * One read per screen, never thrown.\n *\n * `loading` is distinguished from \"not ready\" on purpose: a pay toggle that\n * flickers from enabled to disabled while an edge function answers is a toggle\n * somebody clicks in the gap.\n */\nexport function usePaymentReadiness(): { readiness: PaymentReadiness | null; loading: boolean } {\n const [readiness, setReadiness] = React.useState<PaymentReadiness | null>(null)\n const [loading, setLoading] = React.useState(true)\n\n React.useEffect(() => {\n let cancelled = false\n void readReadiness()\n .then((value) => { if (!cancelled) setReadiness(value) })\n .catch(() => { /* absence is not failure */ })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [])\n\n return { readiness, loading }\n}\n","// \"Enviar teste\" — the message, sent for real, to the operator's own phone.\n//\n// Same function, same template resolution, same sender resolution as the\n// automation's send (`messaging-send`); the only differences are who is calling\n// (the operator's session instead of the platform secret) and the subject type,\n// which is forced to 'test' so a tapped Confirmar on the test message routes\n// nowhere. A preview that renders locally can lie about template approval and\n// sender state — a test that walks the real path cannot.\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\n\nconst SEND_FUNCTION = 'messaging-send'\n\ninterface MinimalClient {\n functions: {\n invoke: (name: string, options: { body: unknown }) => Promise<{ data: unknown; error: unknown }>\n }\n}\n\nexport interface TestSendResult {\n ok: boolean\n /** A code the editor can phrase: 'template_not_approved', 'no_sender', … */\n error?: string\n message?: string\n}\n\nfunction readFunctionError(error: unknown, data: unknown): TestSendResult {\n const payload = (data ?? null) as { error?: string; message?: string } | null\n if (payload?.error) return { ok: false, error: payload.error, message: payload.message }\n const context = (error as { context?: { error?: string; message?: string } } | null)?.context\n if (context?.error) return { ok: false, error: context.error, message: context.message }\n return { ok: false, error: 'send_failed', message: error instanceof Error ? error.message : undefined }\n}\n\nexport async function sendTestMessage(input: {\n eventKey: string\n channel: string\n to: string\n variables: Record<string, string>\n /** Email only: send this draft instead of the saved template row. */\n template?: { subject: string; body: string }\n}): Promise<TestSendResult> {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n const tenantId = getActiveTenantId()\n if (!supabase || !tenantId) return { ok: false, error: 'not_available' }\n const { data, error } = await supabase.functions.invoke(SEND_FUNCTION, {\n body: {\n test: true,\n tenantId,\n channel: input.channel,\n eventKey: input.eventKey,\n to: input.to,\n variables: input.variables,\n subject: { type: 'test', id: crypto.randomUUID() },\n ...(input.template ? { template: input.template } : {}),\n },\n })\n if (error || (data as { error?: string } | null)?.error) return readFunctionError(error, data)\n return { ok: true }\n}\n","import { useOrganizationStore } from '@fayz-ai/admin'\n\n// Re-exports para as views não precisarem saber de onde vem cada peça.\nexport {\n resolveMessages, resolveMessage, renderMessageTemplate,\n getEventsWithoutMessages,\n} from '@fayz-ai/core'\n\n/** Conta ativa — todo modelo é escopado nela. */\nexport function useOrganizationStoreLike(): string | undefined {\n return useOrganizationStore((s) => s.currentOrg?.id)\n}\n","import { getFayzSupabaseClientOptional } from '@fayz-ai/admin'\nimport type { ResolvedFayzAgentConnection } from '@fayz-ai/admin'\nimport { getMessageDefaults } from '@fayz-ai/core'\nimport type { MessageChannel, MessageTemplate } from '@fayz-ai/core'\nimport {\n createFayzAutomationsClient,\n FayzAutomationsError,\n type FayzAutomation,\n type FayzAutomationsClient,\n} from '@fayz-ai/sdk/automations'\nimport type { MessageTemplateStore } from './templates'\n\n// ---------------------------------------------------------------------------\n// The SAME contract as `templates.ts`, served by the platform: behind a Fayz\n// project the platform is what runs the automations, so the customisation has\n// to live there — a local row the platform never reads is a fake switch.\n// ---------------------------------------------------------------------------\n\nfunction toTemplate(automation: FayzAutomation): MessageTemplate | null {\n const eventKey = automation.triggerConfig?.eventKey\n // No eventKey means it isn't a catalogue automation — standalone platform\n // flows have no row on this screen.\n if (!eventKey) return null\n const action = automation.actions?.[0]\n return {\n id: automation.id,\n tenantId: automation.tenantId ?? '',\n eventKey,\n channel: (automation.triggerConfig.sourceChannel ?? 'email') as MessageChannel,\n enabled: automation.enabled,\n // Empty and absent mean the same — \"no customisation\", the catalogue default.\n subject: action?.config?.subject || null,\n body: action?.config?.body || null,\n // The automation name belongs to the platform, not a user rename: the\n // catalogue title still owns the screen.\n name: null,\n // The platform's automation action carries a subject and a body and nothing\n // else, so there is nowhere for a customised button to live yet. NULL, not\n // [], because the catalogue default is what still applies — an empty list\n // would read as \"this tenant removed the buttons\".\n actions: null,\n updatedAt: automation.updatedAt,\n }\n}\n\nfunction catalogDefaultEnabled(eventKey: string, channel: MessageChannel): boolean {\n const def = getMessageDefaults().find((d) => d.eventKey === eventKey)\n return def?.defaultEnabled?.[channel] ?? false\n}\n\nasync function defaultSessionToken(): Promise<string | null> {\n const session = (await getFayzSupabaseClientOptional()?.auth.getSession())?.data.session\n return session?.access_token ?? null\n}\n\nexport interface FayzTemplateStoreDeps {\n client?: FayzAutomationsClient\n getSessionToken?: () => Promise<string | null>\n}\n\nexport function createFayzTemplateStore(\n connection: ResolvedFayzAgentConnection,\n deps: FayzTemplateStoreDeps = {},\n): MessageTemplateStore {\n const client = deps.client ?? createFayzAutomationsClient({\n baseUrl: connection.apiBaseUrl,\n projectId: connection.projectId,\n publishableKey: connection.publishableKey,\n })\n const getSessionToken = deps.getSessionToken ?? defaultSessionToken\n\n // (event_key, channel) → platform automation id, repopulated on every list.\n const ids = new Map<string, string>()\n const keyOf = (eventKey: string, channel: string) => `${eventKey}:${channel}`\n\n async function refresh(tenantId: string): Promise<MessageTemplate[]> {\n const automations = await client.list({ tenantId })\n ids.clear()\n const rows: MessageTemplate[] = []\n for (const automation of automations) {\n const row = toTemplate(automation)\n if (!row) continue\n ids.set(keyOf(row.eventKey, row.channel), automation.id)\n rows.push(row)\n }\n return rows\n }\n\n // One screen mounts several views of the same catalogue (list, detail, CRM ⚡)\n // and StrictMode doubles effects in dev — unshared, opening it costs 8+ identical\n // GETs. One flight per tenant, short-lived; writes invalidate.\n const LIST_TTL_MS = 30_000\n let cache: { tenantId: string; at: number; promise: Promise<MessageTemplate[]> } | null = null\n\n function invalidate(): void {\n cache = null\n }\n\n function load(tenantId: string): Promise<MessageTemplate[]> {\n if (cache && cache.tenantId === tenantId && Date.now() - cache.at < LIST_TTL_MS) return cache.promise\n const promise = refresh(tenantId)\n promise.catch(() => {\n if (cache?.promise === promise) cache = null // a failure must not stay cached for 30s\n })\n cache = { tenantId, at: Date.now(), promise }\n return promise\n }\n\n async function requireToken(): Promise<string> {\n const token = await getSessionToken()\n // Writing needs the app session — same message as the rest of the admin.\n if (!token) throw new Error('Sessão expirada — entre de novo.')\n return token\n }\n\n async function resolveId(eventKey: string, channel: string, tenantId: string): Promise<string | undefined> {\n const key = keyOf(eventKey, channel)\n if (!ids.has(key)) await load(tenantId)\n return ids.get(key)\n }\n\n return {\n async list(tenantId) {\n // No account yet, nothing to ask — the catalogue at its defaults is a\n // complete state, same as the local store when the read fails.\n if (!tenantId) return []\n return load(tenantId)\n },\n\n async upsert(input, tenantId) {\n if (!tenantId) throw new Error('@fayz-ai/plugin-automations: tenantId is required')\n const appSessionToken = await requireToken()\n const key = keyOf(input.eventKey, input.channel)\n let id = await resolveId(input.eventKey, input.channel, tenantId)\n\n if (!id) {\n const action: { subject?: string; body?: string } = {}\n if (input.subject != null) action.subject = input.subject\n if (input.body != null) action.body = input.body\n try {\n const created = await client.create({\n tenantId,\n appSessionToken,\n eventKey: input.eventKey,\n sourceChannel: input.channel,\n // The platform has no \"inherit from catalogue\": materialise the default.\n enabled: input.enabled ?? catalogDefaultEnabled(input.eventKey, input.channel),\n ...(Object.keys(action).length ? { action } : {}),\n })\n ids.set(key, created.id)\n invalidate()\n const row = toTemplate(created)\n if (!row) throw new Error('@fayz-ai/plugin-automations: platform did not round-trip eventKey')\n return row\n } catch (err) {\n // 409: someone created it first — turn it into an update.\n if (!(err instanceof FayzAutomationsError) || err.status !== 409) throw err\n invalidate()\n await refresh(tenantId)\n id = ids.get(key)\n if (!id) throw err\n }\n }\n\n const updated = await client.update({\n id,\n tenantId,\n appSessionToken,\n // Only what was sent: omitting has to mean \"leave it alone\", as in the local store.\n ...(typeof input.enabled === 'boolean' ? { enabled: input.enabled } : {}),\n ...(input.subject !== undefined || input.body !== undefined\n ? {\n action: {\n ...(input.subject !== undefined ? { subject: input.subject } : {}),\n ...(input.body !== undefined ? { body: input.body } : {}),\n },\n }\n : {}),\n })\n invalidate()\n const row = toTemplate(updated)\n if (!row) throw new Error('@fayz-ai/plugin-automations: platform did not round-trip eventKey')\n return row\n },\n\n async reset(eventKey, channel, tenantId) {\n if (!tenantId) return\n const id = await resolveId(eventKey, channel, tenantId)\n // Never customised: the default already applies, nothing to clear.\n if (!id) return\n const appSessionToken = await requireToken()\n // The automation stays (the on/off belongs to it); only the text goes back\n // to the catalogue — null clears the field on the server.\n await client.update({ id, tenantId, appSessionToken, action: { subject: null, body: null } })\n invalidate()\n },\n }\n}\n\nlet cachedClient: { key: string; client: FayzAutomationsClient } | null = null\n\n/** One client per connection — RunLog and the store read the same surface. */\nexport function getFayzAutomationsClient(connection: ResolvedFayzAgentConnection): FayzAutomationsClient {\n const key = `${connection.apiBaseUrl}|${connection.projectId}|${connection.publishableKey}`\n if (cachedClient?.key === key) return cachedClient.client\n const client = createFayzAutomationsClient({\n baseUrl: connection.apiBaseUrl,\n projectId: connection.projectId,\n publishableKey: connection.publishableKey,\n })\n cachedClient = { key, client }\n return client\n}\n","import React from 'react'\nimport { AlertTriangle, ChevronRight, CircleCheck, CircleSlash, History, RefreshCw } from 'lucide-react'\nimport { Badge, Button, Card } from '@fayz-ai/ui'\nimport { loadEventRuns, type EventRun, type EventRunStatus } from '@fayz-ai/core'\nimport type { ResolvedFayzAgentConnection } from '@fayz-ai/admin'\nimport type { FayzAutomationExecution } from '@fayz-ai/sdk/automations'\nimport { getFayzAutomationsClient } from '../data/fayz'\n\n// ---------------------------------------------------------------------------\n// The last runs of this trigger.\n//\n// The screen said what SHOULD happen, never what DID — so testing an automation\n// meant waiting for a customer complaint, and a complaint can't tell \"never\n// fired\" from \"fired and the send failed\", which are defects in different\n// places. The payload stays visible (collapsed) on purpose: it answers \"why did\n// it go out with the wrong name?\" without reproducing the case.\n//\n// Works for ANY trigger: the list is read by event key and every emitted event\n// goes through the same collector, so a new module shows up here untouched.\n// ---------------------------------------------------------------------------\n\nconst STATUS: Record<EventRunStatus, {\n label: string; hint: string; variant: 'success' | 'info' | 'warning' | 'destructive'\n Icon: React.ComponentType<{ className?: string }>\n}> = {\n sent: { label: 'Enviado', hint: 'A mensagem saiu.', variant: 'success', Icon: CircleCheck },\n recorded: {\n label: 'Disparou',\n // Today's honest state: the trigger works, the send doesn't exist yet.\n hint: 'O gatilho disparou e ficou registrado. O envio automático ainda não está ligado neste ambiente.',\n variant: 'info', Icon: History,\n },\n skipped: { label: 'Ignorado', hint: 'O gatilho disparou, mas nada foi enviado — automação desligada ou sem canal.', variant: 'warning', Icon: CircleSlash },\n failed: { label: 'Falhou', hint: 'A tentativa de envio quebrou. O erro está na linha.', variant: 'destructive', Icon: AlertTriangle },\n}\n\nfunction when(iso: string): string {\n const then = new Date(iso).getTime()\n const diff = Date.now() - then\n const min = Math.round(diff / 60000)\n if (min < 1) return 'agora'\n if (min < 60) return `há ${min} min`\n const h = Math.round(min / 60)\n if (h < 24) return `há ${h} h`\n return new Date(iso).toLocaleString('pt-BR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction RunRow({ run }: { run: EventRun }) {\n const [open, setOpen] = React.useState(false)\n const cfg = STATUS[run.status] ?? STATUS.recorded\n const { Icon } = cfg\n\n return (\n <div className=\"border-b border-border last:border-b-0\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-3 px-4 py-2.5 text-left transition-colors hover:bg-muted/40\"\n >\n <ChevronRight className={`h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform ${open ? 'rotate-90' : ''}`} />\n <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <Badge variant={cfg.variant}>{cfg.label}</Badge>\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted-foreground\">\n {typeof run.payload.record_name === 'string' ? run.payload.record_name\n : typeof run.payload.customer_name === 'string' ? run.payload.customer_name\n : typeof run.payload.contact_name === 'string' ? run.payload.contact_name\n : run.subjectId ?? '—'}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{when(run.occurredAt)}</span>\n </button>\n\n {open && (\n <div className=\"space-y-3 bg-muted/20 px-4 pb-4 pt-1\">\n <p className=\"text-xs text-muted-foreground\">{cfg.hint}</p>\n <div>\n <p className=\"mb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Dados do disparo\n </p>\n <pre className=\"overflow-x-auto rounded-md border border-border bg-card p-3 font-mono text-[11px] leading-relaxed\">\n{JSON.stringify(run.payload, null, 2)}\n </pre>\n </div>\n {run.result && (\n <div>\n <p className=\"mb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Resultado\n </p>\n <pre className=\"overflow-x-auto rounded-md border border-border bg-card p-3 font-mono text-[11px] leading-relaxed\">\n{JSON.stringify(run.result, null, 2)}\n </pre>\n </div>\n )}\n {run.error && (\n <p className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 font-mono text-[11px] text-destructive\">\n {run.error}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport function RunLog({ eventKey, tenantId, enabled }: {\n eventKey: string\n tenantId?: string\n /** Current automation state — changes what the empty state means. */\n enabled: boolean\n}) {\n const [runs, setRuns] = React.useState<EventRun[] | null>(null)\n const [loading, setLoading] = React.useState(false)\n\n const load = React.useCallback(async () => {\n setLoading(true)\n setRuns(await loadEventRuns(eventKey, { tenantId, limit: 20 }))\n setLoading(false)\n }, [eventKey, tenantId])\n\n React.useEffect(() => { void load() }, [load])\n\n return (\n <Card className=\"overflow-hidden\">\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-4 py-2.5\">\n <div className=\"min-w-0\">\n <span className=\"text-sm font-medium\">Execuções recentes</span>\n <p className=\"text-xs text-muted-foreground\">Cada vez que este gatilho disparou nesta conta.</p>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void load()} disabled={loading}>\n <RefreshCw className={`h-3.5 w-3.5 ${loading ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n\n {runs === null ? (\n <div className=\"space-y-2 p-4\">\n {[1, 2, 3].map((i) => <div key={i} className=\"h-8 animate-pulse rounded bg-muted/40\" />)}\n </div>\n ) : runs.length === 0 ? (\n <div className=\"flex flex-col items-center gap-1 px-4 py-10 text-center\">\n <History className=\"h-7 w-7 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-sm font-medium\">Nenhum disparo ainda</p>\n <p className=\"max-w-sm text-xs text-muted-foreground\">\n {enabled\n ? 'Assim que este evento acontecer, ele aparece aqui — mesmo antes de existir envio.'\n : 'A automação está desligada. O gatilho continua sendo registrado aqui quando o evento acontecer.'}\n </p>\n </div>\n ) : (\n <div>{runs.map((run) => <RunRow key={run.id} run={run} />)}</div>\n )}\n </Card>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The PLATFORM's runs. Behind a Fayz project the send runs there, so the real\n// history is the platform's — the local collector only knows the trigger fired,\n// not what the platform did with it.\n// ---------------------------------------------------------------------------\n\nconst EXEC_STATUS: Record<string, {\n label: string; variant: 'success' | 'info' | 'destructive'\n Icon: React.ComponentType<{ className?: string }>\n}> = {\n success: { label: 'Executada', variant: 'success', Icon: CircleCheck },\n error: { label: 'Falhou', variant: 'destructive', Icon: AlertTriangle },\n}\n\nfunction ExecutionRow({ execution }: { execution: FayzAutomationExecution }) {\n const cfg = EXEC_STATUS[execution.status]\n ?? { label: execution.status, variant: 'info' as const, Icon: History }\n const { Icon } = cfg\n return (\n <div className=\"border-b border-border px-4 py-2.5 last:border-b-0\">\n <div className=\"flex items-center gap-3\">\n <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <Badge variant={cfg.variant}>{cfg.label}</Badge>\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted-foreground\">\n {execution.automationName}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{when(execution.executedAt)}</span>\n </div>\n {execution.error && (\n <p className=\"ml-6 mt-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 font-mono text-[11px] text-destructive\">\n {execution.error}\n </p>\n )}\n </div>\n )\n}\n\nexport function FayzRunLog({ connection, eventKey, tenantId, enabled }: {\n connection: ResolvedFayzAgentConnection\n eventKey: string\n tenantId?: string\n /** Current automation state — changes what the empty state means. */\n enabled: boolean\n}) {\n const [executions, setExecutions] = React.useState<FayzAutomationExecution[] | null>(null)\n const [loading, setLoading] = React.useState(false)\n\n const load = React.useCallback(async () => {\n if (!tenantId) return\n setLoading(true)\n try {\n setExecutions(await getFayzAutomationsClient(connection).listExecutions({ tenantId, eventKey, limit: 20 }))\n } catch (err) {\n console.warn('[automations] could not load platform executions', err)\n setExecutions([])\n } finally {\n setLoading(false)\n }\n }, [connection, eventKey, tenantId])\n\n React.useEffect(() => { void load() }, [load])\n\n return (\n <Card className=\"overflow-hidden\">\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-4 py-2.5\">\n <div className=\"min-w-0\">\n <span className=\"text-sm font-medium\">Execuções recentes</span>\n <p className=\"text-xs text-muted-foreground\">\n O que a plataforma Fayz executou para este gatilho nesta conta.\n </p>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void load()} disabled={loading}>\n <RefreshCw className={`h-3.5 w-3.5 ${loading ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n\n {executions === null ? (\n <div className=\"space-y-2 p-4\">\n {[1, 2, 3].map((i) => <div key={i} className=\"h-8 animate-pulse rounded bg-muted/40\" />)}\n </div>\n ) : executions.length === 0 ? (\n <div className=\"flex flex-col items-center gap-1 px-4 py-10 text-center\">\n <History className=\"h-7 w-7 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-sm font-medium\">Nenhuma execução ainda</p>\n <p className=\"max-w-sm text-xs text-muted-foreground\">\n {enabled\n ? 'Assim que este evento acontecer, a plataforma executa a automação e o resultado aparece aqui.'\n : 'A automação está desligada — a plataforma não executa nada para este gatilho.'}\n </p>\n </div>\n ) : (\n <div>{executions.map((e) => <ExecutionRow key={e.id} execution={e} />)}</div>\n )}\n </Card>\n )\n}\n","// The real WhatsApp doodle wallpaper, served from the product's own R2 bucket\n// (uploaded by the founder next to the connector marks). One URL beats 39KB of\n// base64 in every app bundle; the preview is an admin surface, always online.\nexport const WHATSAPP_PREVIEW_BG = 'https://assets.fayz.ai/connectors/whatsapp-background.jpg'\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { MessageChannel } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// O que a Meta respondeu sobre cada modelo.\n//\n// Só LEITURA. A tabela é escrita pelo webhook e pela função de sincronização,\n// com service role: quem pudesse marcar `approved` daqui faria o envio tentar um\n// modelo que a Meta nunca liberou, e a recusa chegaria como uma confirmação de\n// horário que não saiu.\n//\n// A leitura traz as linhas do tenant E as do produto (tenant_id NULL). São as\n// duas que importam na tela: a mensagem sai pela do produto até a do tenant ser\n// aprovada, então \"aguardando aprovação\" só é verdade quando NENHUMA das duas\n// está aprovada.\n// ---------------------------------------------------------------------------\n\nexport const PROVIDER_TEMPLATES_TABLE = 'plg_automations_provider_templates'\n\nexport type ProviderTemplateStatus =\n | 'draft' | 'submitted' | 'approved' | 'rejected' | 'paused' | 'disabled'\n\nexport interface ProviderTemplateRow {\n id: string\n /** NULL = o modelo padrão do produto, que serve todos os tenants. */\n tenantId: string | null\n eventKey: string\n channel: MessageChannel\n provider: string\n templateName: string\n status: ProviderTemplateStatus\n rejectionReason: string | null\n updatedAt: string | null\n}\n\nfunction rowToProviderTemplate(row: any): ProviderTemplateRow {\n return {\n id: row.id,\n tenantId: row.tenant_id ?? null,\n eventKey: row.event_key,\n channel: (row.channel ?? 'whatsapp') as MessageChannel,\n provider: row.provider ?? 'tyxter',\n templateName: row.template_name ?? '',\n status: (row.status ?? 'draft') as ProviderTemplateStatus,\n rejectionReason: row.rejection_reason || null,\n updatedAt: row.updated_at ?? row.created_at ?? null,\n }\n}\n\n/**\n * Nunca lança: sem cliente, sem tabela ou sem permissão a lista de automações\n * continua inteira, só sem a pastilha de aprovação. Um erro aqui não pode\n * esconder as automações de e-mail, que não dependem da Meta para nada.\n */\nexport async function loadProviderTemplates(): Promise<ProviderTemplateRow[]> {\n const client = getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n if (!client) return []\n try {\n // Sem filtro de tenant: a RLS já entrega as linhas deste tenant mais as do\n // produto, e filtrar por tenant aqui esconderia justamente o modelo padrão\n // pelo qual a mensagem sai hoje.\n const { data, error } = await client.from(PROVIDER_TEMPLATES_TABLE).select('*')\n if (error) throw error\n return (data ?? []).map(rowToProviderTemplate)\n } catch (err) {\n console.warn('[automations] could not load provider template status', err)\n return []\n }\n}\n\n/**\n * A linha que decide o que a tela mostra para um (evento × canal).\n *\n * A do tenant ganha quando existe — é a que ele está esperando. Se ela não\n * existe, vale a do produto. E se a do tenant foi recusada mas a do produto está\n * aprovada, a mensagem AINDA SAI (pela do produto): quem escolhe aqui é a linha\n * do tenant, e o texto da pastilha é que diz isso.\n */\nexport function providerTemplateFor(\n rows: ProviderTemplateRow[],\n eventKey: string,\n channel: MessageChannel,\n): { own: ProviderTemplateRow | null; fallback: ProviderTemplateRow | null } {\n const matching = rows.filter((r) => r.eventKey === eventKey && r.channel === channel)\n return {\n own: matching.find((r) => r.tenantId !== null) ?? null,\n fallback: matching.find((r) => r.tenantId === null) ?? null,\n }\n}\n","import React from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport type { MessageChannel } from '@fayz-ai/core'\nimport {\n loadProviderTemplates, providerTemplateFor,\n type ProviderTemplateRow,\n} from '../data/provider-templates'\n\n// ---------------------------------------------------------------------------\n// \"Ligado\" não quer dizer \"vai sair\".\n//\n// No WhatsApp a mensagem só existe depois que a Meta aprova o modelo, e a\n// aprovação é assíncrona: pode levar horas e pode voltar recusada. Sem esta\n// pastilha a tela mostra um interruptor verde para uma automação que a Meta\n// ainda não liberou — e o negócio só descobre quando a cliente não recebe.\n//\n// Só o WhatsApp tem isso. E-mail não passa por aprovação de ninguém, então a\n// pastilha some nos outros canais em vez de dizer \"aprovado\" sobre algo que\n// nunca precisou ser.\n// ---------------------------------------------------------------------------\n\nexport type ProviderApproval =\n | { tone: 'ok'; label: string; detail?: string }\n | { tone: 'waiting'; label: string; detail?: string }\n | { tone: 'error'; label: string; detail?: string }\n\n/**\n * O que a linha mostra para um (evento × canal).\n *\n * `null` = nada a dizer, e é o caso comum: canal sem aprovação, ou WhatsApp\n * ainda não conectado (sem nenhuma linha, o assunto não existe para este\n * negócio e uma pastilha vermelha seria um alarme sobre algo que ninguém pediu).\n *\n * A regra que decide o texto é a mesma do envio: sai pelo modelo do produto até\n * o do tenant ser aprovado. Por isso um modelo do tenant recusado, com o do\n * produto aprovado, é um AVISO e não uma falha — a mensagem continua saindo.\n */\nexport function providerApprovalFor(\n rows: ProviderTemplateRow[],\n eventKey: string,\n channel: MessageChannel,\n): ProviderApproval | null {\n if (channel !== 'whatsapp') return null\n const { own, fallback } = providerTemplateFor(rows, eventKey, channel)\n const row = own ?? fallback\n if (!row) return null\n\n const fallbackApproved = fallback?.status === 'approved'\n\n switch (row.status) {\n case 'approved':\n return { tone: 'ok', label: 'Aprovado pela Meta' }\n case 'rejected':\n return {\n tone: fallbackApproved && own ? 'waiting' : 'error',\n label: fallbackApproved && own ? 'Seu texto foi recusado' : 'Recusado pela Meta',\n detail: row.rejectionReason\n ? `Motivo: ${row.rejectionReason}`\n : 'A Meta não disse o motivo.',\n }\n case 'paused':\n return {\n tone: 'error',\n label: 'Pausado pela Meta',\n detail: row.rejectionReason ?? 'Costuma ser excesso de marcações de spam pelos clientes.',\n }\n case 'disabled':\n return { tone: 'error', label: 'Desativado pela Meta', detail: row.rejectionReason ?? undefined }\n case 'submitted':\n return {\n tone: 'waiting',\n label: 'Aguardando aprovação da Meta',\n detail: fallbackApproved && own\n ? 'Até lá a mensagem sai com o texto padrão.'\n : 'A revisão costuma levar algumas horas.',\n }\n default:\n return { tone: 'waiting', label: 'Ainda não enviado para aprovação' }\n }\n}\n\nconst TONE_VARIANT: Record<ProviderApproval['tone'], 'success' | 'warning' | 'destructive'> = {\n ok: 'success',\n waiting: 'warning',\n error: 'destructive',\n}\n\nexport function ProviderTemplateBadge({ approval, showDetail }: {\n approval: ProviderApproval | null\n showDetail?: boolean\n}) {\n if (!approval) return null\n // Aprovado não ganha pastilha na lista: é o estado normal, e uma linha em que\n // tudo está certo não precisa de enfeite. O que precisa aparecer é o que\n // impede a mensagem de sair.\n if (approval.tone === 'ok' && !showDetail) return null\n return (\n <span className=\"inline-flex flex-wrap items-center gap-1.5\">\n <Badge variant={TONE_VARIANT[approval.tone]}>{approval.label}</Badge>\n {showDetail && approval.detail && (\n <span className=\"text-xs text-muted-foreground\">{approval.detail}</span>\n )}\n </span>\n )\n}\n\n/** Uma leitura por tela. Nunca lança: sem a tabela, a lista continua inteira. */\nexport function useProviderTemplates(): ProviderTemplateRow[] {\n const [rows, setRows] = React.useState<ProviderTemplateRow[]>([])\n React.useEffect(() => {\n let cancelled = false\n void loadProviderTemplates().then((data) => { if (!cancelled) setRows(data) })\n return () => { cancelled = true }\n }, [])\n return rows\n}\n","import React from 'react'\nimport { Check, Clock, Mail, MessageSquare, Monitor, RotateCcw, Send, Smartphone, Zap } from 'lucide-react'\nimport { Badge, Button, Card, HeaderTabs, Hint, PhoneField, SubpageHeader, Switch, toast, WhatsAppIcon } from '@fayz-ai/ui'\nimport {\n adminNavigateTo, resolveFayzAgentConnection, AskAIButton, useAgentSurface,\n type AgentSurfaceContribution,\n} from '@fayz-ai/admin'\nimport type { MessageAction, MessageActionId, MessageChannel, PluginAITool, ResolvedMessage } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport { canOfferPayment, usePaymentReadiness } from '../data/payment-preflight'\nimport { sendTestMessage } from '../data/test-send'\nimport { resolveMessage, renderMessageTemplate, useOrganizationStoreLike } from '../lib/runtime'\nimport { FayzRunLog, RunLog } from './RunLog'\nimport { WHATSAPP_PREVIEW_BG } from './whatsapp-preview-bg'\nimport {\n ProviderTemplateBadge, providerApprovalFor, useProviderTemplates,\n} from './ProviderTemplateStatus'\nimport type { MessageTemplateStore } from '../data/templates'\n\n// ---------------------------------------------------------------------------\n// Um modelo, em tela cheia. Duas visões do MESMO texto:\n// Prévia o que a pessoa recebe, com os campos já substituídos\n// Código o texto-fonte, onde se edita\n//\n// A substituição da prévia é a de @fayz-ai/core (renderMessageTemplate), não um\n// replace local: prévia e envio precisam concordar, senão aprova-se um texto e\n// entrega-se outro.\n//\n// \"Igual ao padrão\" é gravado como AUSÊNCIA de personalização (null), não como\n// cópia — assim melhorias no texto padrão continuam chegando a quem nunca\n// mexeu. É o mesmo motivo pelo qual \"Restaurar padrão\" APAGA a linha em vez de\n// escrever o texto de fábrica nela.\n// ---------------------------------------------------------------------------\n\ntype ViewTab = 'preview' | 'code' | 'runs' | 'test'\n\n// ---------------------------------------------------------------------------\n// Os botões da mensagem.\n//\n// O catálogo do plugin define os padrões (Confirmar/Cancelar no agendamento);\n// aqui a pessoa liga e desliga cada um. É uma lista fechada porque um botão não\n// é um texto: cada id tem um significado do lado de cá — `confirm` e `cancel`\n// mexem no agendamento, `pay` abre uma cobrança — e um id inventado seria um\n// botão que o cliente toca e nada acontece.\n//\n// `pay` é o único que depende de algo fora deste app, e por isso é o único que\n// pode aparecer desligado por motivo alheio: sem uma conta de pagamento\n// escolhida na Tyxter, a cobrança não abre. Mostrar o botão desabilitado com o\n// motivo é melhor do que escondê-lo — escondido, a pergunta \"cadê o Pix?\" não\n// tem onde ser respondida.\n// ---------------------------------------------------------------------------\nconst ACTION_CATALOG: Array<{ id: MessageActionId; label: string; kind: MessageAction['kind']; hint: string }> = [\n { id: 'confirm', label: 'Confirma', kind: 'reply', hint: 'O cliente confirma o horário no toque.' },\n { id: 'cancel', label: 'Cancela', kind: 'reply', hint: 'O cliente desmarca sem precisar ligar.' },\n { id: 'pay', label: 'Pagar', kind: 'payment', hint: 'O cliente recebe o Pix na conversa.' },\n]\n\n/**\n * A lista de botões depois de ligar ou desligar um deles.\n *\n * A ordem é a do catálogo e não a do clique: os botões chegam ao WhatsApp\n * numerados, e reordená-los ao ligar o terceiro mudaria o que o segundo faz\n * numa mensagem que a Meta já aprovou.\n */\nexport function nextActions(\n current: MessageAction[], id: MessageActionId, on: boolean,\n): MessageAction[] {\n const kept = new Set(current.filter((a) => a.id !== id).map((a) => a.id))\n if (on) kept.add(id)\n const labels = new Map(current.map((a) => [a.id, a.label]))\n return ACTION_CATALOG\n .filter((a) => kept.has(a.id))\n // O rótulo que já existe ganha do padrão: se o texto foi personalizado,\n // ligar outro botão não é hora de reescrevê-lo.\n .map((a) => ({ id: a.id, label: labels.get(a.id) ?? a.label, kind: a.kind }))\n}\n\n// What each refusal of a test send means to the person reading the toast. The\n// codes are messaging-send's own; an unknown one falls back to its message.\nconst TEST_ERROR: Record<string, string> = {\n template_not_approved: 'O modelo ainda não foi aprovado pela Meta — sincronize os modelos e tente de novo.',\n no_sender: 'Este app ainda não tem um número de WhatsApp ativo. Veja Conversas → Tyxter.',\n not_connected: 'O WhatsApp ainda não está conectado neste app. Veja Conversas → Tyxter.',\n contact_opted_out: 'Este contato pediu para não receber mensagens.',\n invalid_recipient: 'Esse destino não parece válido.',\n not_a_member: 'A sua sessão não pertence a este negócio.',\n not_available: 'O envio de teste não está disponível neste ambiente.',\n email_not_configured: 'O envio de e-mail não está configurado neste app.',\n template_not_found: 'Escreva a mensagem antes de testar.',\n email_rejected: 'O provedor de e-mail recusou a mensagem.',\n email_credential_rejected: 'A chave de e-mail do app foi recusada pelo provedor.',\n email_rate_limited: 'O provedor pediu uma pausa — tente de novo em instantes.',\n}\n\n/**\n * O teste que anda o caminho de verdade.\n *\n * A prévia acima substitui variáveis localmente e não pode mentir sobre o texto\n * — mas só o envio real revela o resto: modelo aprovado, número ativo, chave da\n * plataforma. Por isso o teste chama a MESMA função do envio da automação, com\n * a sessão da pessoa no lugar do segredo da plataforma e um assunto 'test' que\n * nenhum botão consegue transformar em ação sobre um registro real.\n */\nfunction TestSendStrip({ eventKey, channel, placeholders, template }: {\n eventKey: string\n channel: MessageChannel\n placeholders: string[]\n /** Email only: the draft on screen goes with the test, saved or not. */\n template?: { subject: string; body: string }\n}) {\n const isEmail = channel === 'email'\n const [recipient, setRecipient] = React.useState('')\n const [sending, setSending] = React.useState(false)\n const valid = isEmail\n ? /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(recipient.trim())\n : recipient.replace(/\\D/g, '').length >= 10\n\n const send = async () => {\n setSending(true)\n try {\n const variables = Object.fromEntries(placeholders.map((p) => {\n const key = p.replace(/[{}]/g, '').trim()\n return [key, SAMPLE[key] ?? key]\n }))\n const result = await sendTestMessage({ eventKey, channel, to: recipient.trim(), variables, template })\n if (result.ok) {\n toast.success(isEmail\n ? 'Teste enviado — confira a caixa de entrada desse e-mail'\n : 'Teste enviado — confira o WhatsApp desse número')\n } else {\n toast.error(TEST_ERROR[result.error ?? ''] ?? result.message ?? 'Não foi possível enviar o teste')\n }\n } finally {\n setSending(false)\n }\n }\n\n return (\n // Sem moldura própria: o strip vive dentro do Card da aba Testar, e uma\n // borda aqui era o anel duplicado de sempre.\n <div className=\"mt-3 flex flex-wrap items-end gap-2\">\n <div className=\"min-w-0 flex-1\">\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">\n {isEmail ? 'E-mail que recebe o teste' : 'Número que recebe o teste'}\n </label>\n {isEmail ? (\n <input\n type=\"email\"\n value={recipient}\n onChange={(e) => setRecipient(e.target.value)}\n placeholder=\"voce@exemplo.com\"\n disabled={sending}\n aria-label=\"E-mail que recebe o teste\"\n className=\"w-full rounded-input border border-input bg-card px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n ) : (\n <PhoneField\n value={recipient}\n onChange={setRecipient}\n placeholder=\"(21) 99999-9999\"\n disabled={sending}\n aria-label=\"Número que recebe o teste\"\n />\n )}\n </div>\n <Button variant=\"outline\" onClick={() => void send()} disabled={!valid || sending}>\n <Send className=\"mr-2 h-3.5 w-3.5\" />\n {sending ? 'Enviando…' : 'Enviar teste'}\n </Button>\n </div>\n )\n}\n\nconst TABS: { value: ViewTab; label: string }[] = [\n { value: 'preview', label: 'Prévia' },\n { value: 'code', label: 'Código' },\n // O que já aconteceu. Fica ao lado do texto, e não numa tela à parte, porque\n // é a mesma pergunta em dois tempos: o que vai sair, e o que saiu.\n { value: 'runs', label: 'Execuções' },\n]\n\n// Só aparece nos canais que têm envio de teste (WhatsApp, e-mail).\nconst TEST_TAB: { value: ViewTab; label: string } = { value: 'test', label: 'Testar' }\n\nconst CHANNEL_LABEL: Record<MessageChannel, string> = {\n email: 'E-mail', whatsapp: 'WhatsApp', sms: 'SMS', push: 'Push', webchat: 'Chat',\n}\n\n// The channel is what distinguishes this screen from its siblings (the same\n// event exists per channel), so the identity slot carries the CHANNEL's face —\n// and WhatsApp's face is its mark, not a generic bubble.\nconst CHANNEL_ICON: Record<MessageChannel, React.ComponentType<{ className?: string }>> = {\n email: Mail, whatsapp: WhatsAppIcon, sms: Smartphone, push: MessageSquare, webchat: MessageSquare,\n}\n\n/** Dados de exemplo da prévia. Não são de ninguém — a tela diz isso. */\n// ---------------------------------------------------------------------------\n// A mensagem, escrita pelo assistente.\n//\n// Client-plane e `mode: 'read'` de propósito: a ferramenta NÃO grava nada — ela\n// preenche o rascunho do editor ao lado, e o Salvar continua sendo um clique de\n// uma pessoa. Declarar `persist` aqui pediria uma confirmação para escrever num\n// campo de texto, e avisaria as listas do app de uma mudança que não houve.\n// ---------------------------------------------------------------------------\nconst WRITE_MESSAGE_TOOL: PluginAITool = {\n id: 'automations.writeMessage',\n name: 'writeAutomationMessage',\n description:\n 'Writes the subject and body of the automation message the user has open, into the editor (it does NOT save — the user does). '\n + 'Use ONLY the placeholders listed in the surface state, spelled exactly, including the braces: an invented one renders as literal text in a message a customer reads. '\n + 'Match the channel: e-mail takes a subject and paragraphs; WhatsApp and SMS take no subject and few lines.',\n icon: 'MessageSquare',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Automations',\n parameters: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: 'Subject line. Leave empty for channels that have none.' },\n body: { type: 'string', description: 'Message body, with placeholders where they belong.' },\n },\n required: ['body'],\n },\n}\n\nconst SAMPLE: Record<string, string> = {\n store_name: 'Sua Loja', company_name: 'Sua Empresa',\n customer_name: 'Maria Silva', contact_name: 'Maria Silva', lead_name: 'Maria Silva',\n order_number: '1042', order_total: 'R$ 189,90',\n order_items: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00',\n tracking_code: 'BR123456789BR', cart_url: 'https://sualoja.com.br/carrinho',\n deal_name: 'Proposta — Reforma da fachada', deal_value: 'R$ 12.400,00',\n stage_name: 'Negociação', owner_name: 'João Pereira',\n appointment_date: '12/08/2026', appointment_time: '14:30',\n}\n\nexport interface AutomationDetailPageProps {\n eventKey?: string\n channel?: string\n store: MessageTemplateStore\n /** Para onde o \"voltar\" leva — a lista pode morar no menu ou nas\n * configurações, e a pessoa tem que voltar por onde entrou. */\n backTo?: string\n /**\n * Montada na coluna da direita, ao lado da lista, em vez de ser a tela.\n *\n * Some o cabeçalho próprio: quem nomeia a coluna e oferece a volta é o\n * cabeçalho dela, e desenhar o nosso ali embaixo era o mesmo título duas\n * vezes, com dois jeitos de sair.\n */\n embedded?: boolean\n /**\n * Como sair, quando sair NÃO é navegar.\n *\n * Aberta pela coluna a partir de outra tela (o raio do CRM), a saída é fechar\n * a coluna e continuar onde se estava — `backTo` levaria embora justamente a\n * tela que se queria manter.\n */\n onDone?: () => void\n}\n\nexport function AutomationDetailPage({ eventKey, channel, store, backTo = '/automations', embedded, onDone }: AutomationDetailPageProps) {\n const tenantId = useOrganizationStoreLike()\n const runtime = usePluginRuntimeOptional()\n const fayzConnection = React.useMemo(() => resolveFayzAgentConnection(), [])\n const [message, setMessage] = React.useState<ResolvedMessage | null | undefined>(undefined)\n const [tab, setTab] = React.useState<ViewTab>('preview')\n const [device, setDevice] = React.useState<'desktop' | 'mobile'>('desktop')\n const [draft, setDraft] = React.useState<{ subject: string; body: string } | null>(null)\n // O texto de cada botão enquanto se digita. Grava no blur, não por tecla:\n // cada gravação vai direto ao banco (como o interruptor ao lado), e um PATCH\n // por caractere seria uma automação salva vinte vezes por palavra.\n const [labelDrafts, setLabelDrafts] = React.useState<Record<string, string>>({})\n const [saving, setSaving] = React.useState(false)\n const providerTemplates = useProviderTemplates()\n const { readiness, loading: readinessLoading } = usePaymentReadiness()\n\n const back = React.useCallback(\n () => (onDone ? onDone() : adminNavigateTo(backTo)),\n [onDone, backTo],\n )\n\n // --- assistant surface ---------------------------------------------------\n const surfaceRef = React.useRef({ message, draft })\n surfaceRef.current = { message, draft }\n\n const agentSurface = React.useMemo<AgentSurfaceContribution>(() => ({\n id: 'automations.message',\n pluginId: 'automations',\n instructions:\n 'The user is editing one automation message. `placeholders` in the surface state are the ONLY variables that resolve — copy them verbatim, braces included. '\n + 'Call writeAutomationMessage once with the whole text; the editor fills and the user reviews before saving.',\n describe: () => {\n const o = surfaceRef.current\n if (!o.message) return { title: 'Automação' }\n const current = o.draft ?? { subject: o.message.subject, body: o.message.body }\n return {\n title: `Automação — ${o.message.event?.title ?? o.message.event?.name ?? ''}`,\n state: {\n event: o.message.event?.name ?? null,\n channel: o.message.channel,\n hasSubject: o.message.channel === 'email',\n placeholders: Object.keys(SAMPLE).map((key) => `{{${key}}}`),\n currentSubject: current.subject,\n currentBody: current.body,\n },\n }\n },\n tools: [{\n tool: WRITE_MESSAGE_TOOL,\n execute: (args: Record<string, unknown>) => {\n const o = surfaceRef.current\n if (!o.message) return { ok: false, error: 'no_message_open' }\n const current = o.draft ?? { subject: o.message.subject, body: o.message.body }\n const body = String(args.body ?? '').trim()\n if (!body) return { ok: false, error: 'empty_body' }\n const subject = args.subject === undefined ? current.subject : String(args.subject)\n setDraft({ subject, body })\n // Leva para a aba do texto: ele acabou de mudar e a pré-visualização\n // não mostra onde mexer.\n setTab('code')\n return { ok: true, filled: true, saved: false, note: 'Draft filled — the user still has to press Save.' }\n },\n }],\n }), [])\n useAgentSurface(agentSurface)\n\n const reload = React.useCallback(async () => {\n if (!eventKey || !channel) { setMessage(null); return }\n let overrides: Awaited<ReturnType<MessageTemplateStore['list']>> = []\n try {\n overrides = await store.list(tenantId)\n } catch (err) {\n console.warn('[automations] could not load overrides; showing defaults', err)\n }\n const found = resolveMessage(decodeURIComponent(eventKey), channel as MessageChannel, overrides, runtime?.events ?? [])\n setMessage(found)\n if (found) setDraft({ subject: found.subject, body: found.body })\n }, [eventKey, channel, store, tenantId, runtime])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const header = embedded ? null : (\n <SubpageHeader\n title={message === undefined ? '' : (message?.override?.name ?? message?.event.title ?? message?.event.name ?? 'Automação')}\n parentLabel=\"Automações\"\n onBack={back}\n />\n )\n\n if (message === undefined) {\n return (\n <div className=\"space-y-4\">\n {header}\n <div className=\"h-8 w-64 animate-pulse rounded bg-muted\" />\n <Card className=\"h-96 animate-pulse\" />\n </div>\n )\n }\n\n if (!message) {\n return (\n <>\n {header}\n <Card className=\"flex flex-col items-center gap-2 p-12 text-center\">\n <Mail className=\"h-9 w-9 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"font-semibold\">Automação não encontrada</p>\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n O evento <code className=\"font-mono\">{eventKey}</code> não está no catálogo — o módulo\n que o registra pode não estar instalado nesta conta.\n </p>\n <Button variant=\"outline\" className=\"mt-2\" onClick={back}>Voltar para Automações</Button>\n </Card>\n </>\n )\n }\n\n const event = message.event\n // O texto de fábrica: o que \"restaurar padrão\" devolve. Vem do registro de\n // padrões, não do evento — o evento é o fato, não a mensagem.\n const fallback = { subject: message.override ? undefined : message.subject, body: message.body }\n const ChannelIcon = CHANNEL_ICON[message.channel] ?? Zap\n const isWhatsapp = message.channel === 'whatsapp'\n const current = draft ?? { subject: message.subject, body: message.body }\n const dirty = current.subject !== message.subject || current.body !== message.body\n const hasSubject = message.channel === 'email'\n\n const patch = async (input: Parameters<MessageTemplateStore['upsert']>[0]) => {\n setSaving(true)\n try {\n await store.upsert(input, tenantId)\n await reload()\n } catch (err) {\n console.warn('[automations] save failed', err)\n toast.error('Não foi possível salvar')\n } finally {\n setSaving(false)\n }\n }\n\n const save = () => void patch({\n eventKey: event.name,\n channel: message.channel,\n // Igual ao padrão volta a ser \"sem personalização\", não uma cópia.\n subject: current.subject.trim() === (fallback?.subject ?? '') ? null : current.subject.trim() || null,\n body: current.body.trim() === fallback?.body ? null : current.body.trim() || null,\n })\n\n const reset = async () => {\n setDraft({ subject: fallback?.subject ?? '', body: fallback?.body ?? '' })\n setSaving(true)\n try {\n // Apaga a linha inteira: com ela fora, o padrão volta a valer e melhorias\n // no texto de fábrica voltam a chegar aqui.\n await store.reset(event.name, message.channel, tenantId)\n await reload()\n toast.success('Texto restaurado')\n } catch (err) {\n console.warn('[automations] reset failed', err)\n toast.error('Não foi possível restaurar')\n } finally {\n setSaving(false)\n }\n }\n\n const previewSubject = renderMessageTemplate(current.subject, SAMPLE)\n const previewBody = renderMessageTemplate(current.body, SAMPLE)\n\n return (\n <div className=\"space-y-5\">\n {header}\n\n {/* Identidade e controles.\n Numa página larga cabem na mesma linha. Na coluna não cabem: as\n pastilhas quebravam uma por linha, a descrição virava uma coluna de\n três palavras e \"Restaurar padrão\" por extenso empurrava o Salvar para\n fora — por isso na coluna eles são duas faixas empilhadas, com o\n restaurar reduzido ao seu glifo. */}\n <div className={embedded ? 'space-y-3' : 'flex flex-wrap items-start gap-3'}>\n <div className={embedded ? 'flex items-start gap-3' : 'contents'}>\n <span\n className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border ${\n isWhatsapp\n ? 'border-[#25D366]/30 bg-[#25D366]/10 text-[#1faf55]'\n : 'border-border text-muted-foreground'\n }`}\n >\n <ChannelIcon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"outline\">{CHANNEL_LABEL[message.channel]}</Badge>\n <Badge variant=\"outline\">{message.kind === 'marketing' ? 'Marketing' : 'Transacional'}</Badge>\n {message.customized && <Badge variant=\"info\">Personalizado</Badge>}\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{event.description}</p>\n {/* Aqui a pastilha aparece MESMO quando está tudo certo, e traz o\n motivo junto: é a tela onde se decide o que fazer com uma\n recusa, e \"recusado\" sem o motivo não deixa ninguém agir. */}\n <div className=\"mt-1.5\">\n <ProviderTemplateBadge\n approval={providerApprovalFor(providerTemplates, event.name, message.channel)}\n showDetail\n />\n </div>\n </div>\n </div>\n\n <div className={embedded ? 'flex items-center gap-2' : 'flex shrink-0 flex-wrap items-center gap-2'}>\n {/* O mesmo interruptor da lista: liga na hora, sem passar pelo Salvar\n — que aqui é só do TEXTO. Vem primeiro na coluna porque é o que se\n toca com mais frequência, e porque ligar não é salvar. */}\n <Switch\n size=\"md\"\n checked={message.enabled}\n onCheckedChange={(next) => void patch({ eventKey: event.name, channel: message.channel, enabled: next })}\n disabled={saving}\n label={message.enabled ? 'Ativa' : 'Inativa'}\n />\n <div className={embedded ? 'ml-auto flex items-center gap-2' : 'contents'}>\n <Hint label=\"Descarta o texto personalizado e volta ao padrão do produto.\">\n <span>\n <Button\n variant={embedded ? 'ghost' : 'outline'}\n size={embedded ? 'icon' : undefined}\n onClick={() => void reset()}\n disabled={!message.customized || saving}\n aria-label={embedded ? 'Restaurar padrão' : undefined}\n >\n <RotateCcw className={embedded ? 'h-4 w-4' : 'mr-2 h-4 w-4'} />\n {!embedded && 'Restaurar padrão'}\n </Button>\n </span>\n </Hint>\n {/* Escrever a mensagem É o trabalho desta tela, e é o trabalho que\n um modelo faz melhor que um campo vazio. A ferramenta preenche o\n RASCUNHO — quem salva continua sendo a pessoa, no botão ao lado. */}\n <AskAIButton\n variant={embedded ? 'ghost' : 'outline'}\n label={embedded ? '' : undefined}\n hint=\"Descreva o tom da mensagem…\"\n intro={{\n role: 'setup',\n persona: 'Redator das automações',\n pitch: 'Diga como esta mensagem deve soar.',\n description:\n 'Escrevo o assunto e o corpo desta automação usando as variáveis que ela tem à disposição. O texto cai no editor ao lado para você revisar — nada é salvo sem você.',\n suggestions: [\n { label: 'Mais curta e direta' },\n { label: 'Mais calorosa, com o nome do cliente' },\n { label: 'Formal, para um público corporativo' },\n ],\n }}\n />\n {/* Uma tela, um CTA: o Salvar só se veste de botão primário quando\n há o que salvar. \"Salvo\" não é uma ação — desenhá-lo como um\n botão apagado deixava um CTA morto no lugar mais nobre da\n coluna; como confirmação silenciosa, ele diz o estado e sai do\n caminho. */}\n {dirty || saving ? (\n <Button onClick={save} disabled={saving}>\n {saving ? 'Salvando…' : 'Salvar'}\n </Button>\n ) : (\n <span className=\"inline-flex h-9 items-center gap-1 px-2 text-xs font-medium text-muted-foreground\">\n <Check className=\"h-3.5 w-3.5\" />\n Salvo\n </span>\n )}\n </div>\n </div>\n </div>\n\n <HeaderTabs\n tabs={isWhatsapp || message.channel === 'email' ? [...TABS, TEST_TAB] : TABS}\n value={tab}\n onChange={setTab}\n aria-label=\"Visualização\"\n />\n\n <div className=\"flex flex-wrap items-center gap-x-6 gap-y-2 border-b border-border pb-4 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Zap className=\"h-3.5 w-3.5\" />\n Gatilho:\n <code className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-foreground\">{event.name}</code>\n </span>\n <span className=\"inline-flex items-center gap-1.5\">\n <Clock className=\"h-3.5 w-3.5\" />\n {event.trigger}\n </span>\n {hasSubject && current.subject && <span className=\"min-w-0 truncate\">Assunto: {current.subject}</span>}\n </div>\n\n {tab === 'runs' ? (\n // Atrás de um projeto Fayz o histórico verdadeiro é o da plataforma —\n // é ela quem executa. Fora dele, o coletor local continua valendo.\n fayzConnection ? (\n <FayzRunLog connection={fayzConnection} eventKey={event.name} tenantId={tenantId} enabled={message.enabled} />\n ) : (\n <RunLog eventKey={event.name} tenantId={tenantId} enabled={message.enabled} />\n )\n ) : tab === 'preview' ? (\n <Card className=\"overflow-hidden\">\n {/* Na coluna, a aba ativa já diz \"Prévia\" logo acima — repetir o\n título dentro do cartão era o mesmo nome duas vezes a um dedo de\n distância. A faixa só existe na página larga, onde carrega a\n comparação computador/celular. */}\n {!embedded && (\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-4 py-2.5\">\n <span className=\"text-sm font-medium\">Prévia</span>\n {/* Computador/celular é uma COMPARAÇÃO de larguras, e a coluna tem\n uma só: os dois botões levavam ao mesmo desenho, e um controle\n que não muda nada é pior do que controle nenhum. */}\n <div className=\"flex items-center gap-1\">\n {(['desktop', 'mobile'] as const).map((d) => (\n <button\n key={d}\n type=\"button\"\n onClick={() => setDevice(d)}\n aria-label={d === 'desktop' ? 'Computador' : 'Celular'}\n className={`flex h-7 w-7 items-center justify-center rounded-md transition-colors ${\n device === d ? 'bg-muted text-foreground' : 'text-muted-foreground hover:bg-muted/60'\n }`}\n >\n {d === 'desktop' ? <Monitor className=\"h-4 w-4\" /> : <Smartphone className=\"h-4 w-4\" />}\n </button>\n ))}\n </div>\n </div>\n )}\n\n <div className={embedded ? 'bg-muted/30 p-4' : 'bg-muted/30 p-6'}>\n {/* WhatsApp/SMS não têm assunto nem cabeçalho de remetente — mostrar\n a moldura de e-mail neles prometeria uma forma que o canal não\n tem. */}\n {/* Uma aresta só: a moldura interna vive de sombra e cantos\n clipados — borda aqui somava um segundo anel dentro do Card. */}\n <div\n className={`mx-auto overflow-hidden rounded-card bg-card shadow-sm transition-[max-width] ${\n device === 'mobile' ? 'max-w-[380px]' : hasSubject ? 'max-w-[600px]' : 'max-w-[420px]'\n }`}\n >\n {hasSubject ? (\n <>\n {/* Moldura de navegador (Safari): a prévia de e-mail é \"como\n o cliente vê no Gmail\", e a janela diz isso sem legenda.\n Semáforo decorativo — nada aqui é clicável. */}\n <div aria-hidden className=\"flex items-center gap-1.5 border-b border-border bg-muted/40 px-4 py-2.5\">\n <span className=\"h-3 w-3 rounded-full bg-[#ff5f57]\" />\n <span className=\"h-3 w-3 rounded-full bg-[#febc2e]\" />\n <span className=\"h-3 w-3 rounded-full bg-[#28c840]\" />\n </div>\n <div className=\"px-6 pb-4 pt-5\">\n <p className=\"text-base font-semibold leading-snug\">{previewSubject}</p>\n {/* A linha do remetente, como no Gmail: avatar + nome no\n topo-esquerdo, destinatário embaixo, hora à direita. */}\n <div className=\"mt-4 flex items-center gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary\">\n {(SAMPLE.store_name ?? 'S').charAt(0)}\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold\">{SAMPLE.store_name}</p>\n <p className=\"text-xs text-muted-foreground\">para mim</p>\n </div>\n <span className=\"ml-auto shrink-0 text-xs text-muted-foreground\">09:41</span>\n </div>\n </div>\n <div className=\"whitespace-pre-wrap border-t border-border px-6 py-5 text-sm leading-relaxed\">{previewBody}</div>\n </>\n ) : (\n <div\n className=\"p-4\"\n // O papel de parede real do WhatsApp: quem escreve vê a\n // mensagem no palco em que ela vai aparecer. O balão é\n // sempre o de saída (verde) — é o negócio falando. Sem\n // raio próprio: a moldura clipa os cantos.\n style={isWhatsapp ? { backgroundImage: `url(${WHATSAPP_PREVIEW_BG})`, backgroundSize: 'cover', backgroundPosition: 'center' } : undefined}\n >\n <div className=\"whitespace-pre-wrap rounded-2xl rounded-tl-sm bg-[#dcf8c6] px-3 py-2 text-sm leading-relaxed text-[#111b21] shadow-sm\">\n {previewBody}\n </div>\n {/* Os botões fazem parte da mensagem, então fazem parte da\n prévia: quem escreve o texto precisa ver que Confirmar e\n Cancelar já dizem o que a última linha ia dizer. */}\n {message.actions.length > 0 && (\n <div className=\"mt-1 space-y-1\">\n {message.actions.map((action) => (\n <div\n key={action.id}\n // Chips brancos, como o WhatsApp desenha reply buttons —\n // no papel de parede o verde do balão os engolia.\n className=\"rounded-lg bg-white px-3 py-1.5 text-center text-sm font-medium text-[#1e7fd6] shadow-sm\"\n >\n {action.label}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n <p className=\"mt-4 text-center text-xs text-muted-foreground\">\n Dados de exemplo — nenhum registro real foi usado.\n </p>\n </div>\n </Card>\n ) : tab === 'test' ? (\n <Card className=\"p-4\">\n <p className=\"text-sm text-muted-foreground\">\n {isWhatsapp\n ? 'Envio real, pelo mesmo caminho da automação — modelo aprovado, número ativo e entrega de verdade, com os dados de exemplo.'\n : 'Envio real, pelo mesmo caminho da automação — vai o texto que está na tela, salvo ou não, com os dados de exemplo.'}\n </p>\n <TestSendStrip\n eventKey={event.name}\n channel={message.channel}\n placeholders={message.placeholders}\n // WhatsApp must ride the Meta-approved template; email tests\n // exactly the text on screen, saved or not.\n template={message.channel === 'email'\n ? { subject: current.subject, body: current.body }\n : undefined}\n />\n </Card>\n ) : (\n <Card className=\"space-y-4 p-4\">\n {hasSubject && (\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">Assunto</label>\n <input\n value={current.subject}\n onChange={(e) => setDraft({ ...current, subject: e.target.value })}\n className=\"w-full rounded-input border border-input bg-card px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">Mensagem</label>\n <textarea\n rows={14}\n value={current.body}\n onChange={(e) => setDraft({ ...current, body: e.target.value })}\n className=\"w-full rounded-input border border-input bg-card px-3 py-2 font-mono text-xs leading-relaxed focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n {message.channel === 'whatsapp' && (\n <div>\n <p className=\"mb-1.5 text-xs font-medium text-muted-foreground\">\n Botões — o cliente responde no toque, sem digitar\n </p>\n <div className=\"space-y-2\">\n {ACTION_CATALOG.map((action) => {\n const active = message.actions.find((a) => a.id === action.id)\n const on = Boolean(active)\n // `pay` é o único que pergunta a alguém de fora se pode.\n const gated = action.id === 'pay' && !canOfferPayment(readiness)\n const blocked = gated && !readinessLoading\n const labelValue = labelDrafts[action.id] ?? active?.label ?? action.label\n const commitLabel = () => {\n const next = labelValue.trim()\n setLabelDrafts((d) => { const { [action.id]: _, ...rest } = d; return rest })\n if (!active || !next || next === active.label) return\n void patch({\n eventKey: event.name,\n channel: message.channel,\n actions: message.actions.map((a) => (a.id === action.id ? { ...a, label: next } : a)),\n })\n }\n return (\n <div key={action.id} className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <Switch\n size=\"md\"\n checked={on}\n disabled={saving || gated}\n onCheckedChange={(next) => void patch({\n eventKey: event.name,\n channel: message.channel,\n actions: nextActions(message.actions, action.id, next),\n })}\n label={on ? '' : action.label}\n />\n {on && (\n // O texto do botão como a cliente vê. 25 caracteres é o\n // teto da Meta para QUICK_REPLY; mudar o texto de um\n // modelo já aprovado dispara nova aprovação — a\n // pastilha de status acima conta essa história.\n <input\n value={labelValue}\n maxLength={25}\n disabled={saving}\n aria-label={`Texto do botão ${action.label}`}\n onChange={(e) => setLabelDrafts((d) => ({ ...d, [action.id]: e.target.value }))}\n onBlur={commitLabel}\n onKeyDown={(e) => { if (e.key === 'Enter') (e.target as HTMLInputElement).blur() }}\n className=\"w-36 rounded-input border border-input bg-card px-2 py-1 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n <p className=\"text-xs text-muted-foreground\">\n {blocked\n ? 'Para cobrar por aqui, configure a conta de pagamento em Conversas → Tyxter.'\n : action.hint}\n </p>\n </div>\n )\n })}\n </div>\n </div>\n )}\n <div>\n <p className=\"mb-1.5 text-xs font-medium text-muted-foreground\">\n Campos deste evento — o envio substitui pelo dado real\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {message.placeholders.map((p) => (\n <span key={p} className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground\">\n {p}\n </span>\n ))}\n </div>\n </div>\n </Card>\n )}\n </div>\n )\n}\n","import type { UnifiedConnector } from '@fayz-ai/admin'\nimport type { ConnectorDelivery } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// As automações que a INTEGRAÇÃO é dona.\n//\n// A tela de automações lia uma fonte só: mensagens. \"Quando um horário é\n// agendado → manda um e-mail\" é uma preferência que alguém escolheu, mora numa\n// linha de `plg_automations_templates` e pode ser apagada. \"Quando um horário é\n// agendado → cria o evento no Google Calendar\" não é preferência nenhuma: é o\n// que a integração É. Por isso é uma SEGUNDA fonte de linhas, e não um texto\n// padrão fingido — um texto padrão viraria uma linha que o usuário pode apagar,\n// deixando a integração conectada e meio ligada em silêncio.\n//\n// Elas existem só enquanto a conexão está viva. Desconectar é a saída, e é a\n// única — o contrato está em ConnectorManagedAutomation (@fayz-ai/core).\n// ---------------------------------------------------------------------------\n\nexport interface ConnectorAutomationRow {\n connectorId: string\n connectorName: string\n /** Onde a integração é configurada — para onde a linha leva. */\n hostPluginId?: string\n /** A cara da integração, resolvida como em qualquer outra tela (ConnectorMark). */\n icon?: string\n logoUrl?: string\n eventKey: string\n label: string\n /** O locatário pode desligar esta e seguir conectado. */\n optional: boolean\n /** Registro a registro: o que chegou no provedor. Ausente = a integração não conta. */\n listDeliveries?: (options?: { eventKey?: string; limit?: number }) => Promise<ConnectorDelivery[]>\n}\n\n/** As linhas de automação dos conectores CONECTADOS. Nada dos demais. */\nexport function connectorAutomationRows(connectors: UnifiedConnector[]): ConnectorAutomationRow[] {\n const out: ConnectorAutomationRow[] = []\n for (const connector of connectors) {\n if (connector.state !== 'connected') continue\n for (const auto of connector.definition?.managedAutomations ?? []) {\n out.push({\n connectorId: connector.id,\n connectorName: connector.name,\n hostPluginId: connector.hostPluginId,\n icon: connector.icon,\n logoUrl: connector.logoUrl,\n eventKey: auto.eventKey,\n label: auto.label,\n optional: auto.optional ?? false,\n ...(connector.definition?.listDeliveries\n ? { listDeliveries: connector.definition.listDeliveries.bind(connector.definition) }\n : {}),\n })\n }\n }\n return out\n}\n\n/** Agrupadas por conector: o dono precisa estar escrito em cima das linhas. */\nexport function groupConnectorAutomations(\n rows: ConnectorAutomationRow[],\n): {\n connectorId: string\n connectorName: string\n hostPluginId?: string\n icon?: string\n logoUrl?: string\n items: ConnectorAutomationRow[]\n}[] {\n const groups: ReturnType<typeof groupConnectorAutomations> = []\n for (const row of rows) {\n let group = groups.find((g) => g.connectorId === row.connectorId)\n if (!group) {\n group = {\n connectorId: row.connectorId,\n connectorName: row.connectorName,\n hostPluginId: row.hostPluginId,\n icon: row.icon,\n logoUrl: row.logoUrl,\n items: [],\n }\n groups.push(group)\n }\n group.items.push(row)\n }\n return groups\n}\n","import React from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { Card } from '@fayz-ai/ui'\nimport { adminNavigateTo, connectorRoute, ConnectorDeliveries, ConnectorMark } from '@fayz-ai/admin'\nimport {\n groupConnectorAutomations,\n type ConnectorAutomationRow,\n} from '../lib/connector-automations'\n\n// ---------------------------------------------------------------------------\n// As linhas que a integração é dona.\n//\n// Sem interruptor e sem lixeira, de propósito: uma linha apagada deixaria a\n// integração conectada e meio ligada, e semanas depois isso chega como \"o\n// Google Calendar parou de funcionar\". A saída é desconectar, e a linha diz\n// isso em texto — não em botão cinza, que se lê como algo que o usuário poderia\n// consertar (mesmo padrão de ConnectorDetail → \"faz parte do app\").\n// ---------------------------------------------------------------------------\n\nexport function ConnectorAutomations({ rows }: { rows: ConnectorAutomationRow[] }) {\n if (rows.length === 0) return null\n\n return (\n <>\n {groupConnectorAutomations(rows).map((group) => {\n const href = connectorRoute({ hostPluginId: group.hostPluginId })\n return (\n <div key={group.connectorId} className=\"space-y-3\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.connectorName}\n </p>\n {group.items.map((row) => (\n <AutomationCard\n key={`${group.connectorId}:${row.eventKey}`}\n row={row}\n group={group}\n href={href}\n />\n ))}\n </div>\n )\n })}\n </>\n )\n}\n\n/**\n * Uma linha da integração, e — quando a integração sabe responder — o que de\n * fato chegou lá.\n *\n * A tela dizia que o gatilho existe. Não dizia se o pedido subiu, que é a\n * pergunta que alguém tem depois de cadastrar. As duas metades eram contadas por\n * sistemas diferentes e nenhum conhecia o outro.\n */\nfunction AutomationCard({\n row,\n group,\n href,\n}: {\n row: ConnectorAutomationRow\n group: { connectorId: string; connectorName: string; icon?: string; logoUrl?: string }\n href: string\n}) {\n const [open, setOpen] = React.useState(false)\n\n return (\n <Card className=\"overflow-hidden\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => adminNavigateTo(href)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); adminNavigateTo(href) }\n }}\n className=\"flex cursor-pointer items-start gap-4 p-4 transition-colors hover:bg-muted/30 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {/* A mesma cara que a integração tem em qualquer outra tela: um plugue\n cinza aqui e o logo do Bling na tela de conectores é a mesma coisa\n parecendo duas. */}\n <ConnectorMark\n connector={{\n id: group.connectorId,\n name: group.connectorName,\n icon: group.icon,\n logoUrl: group.logoUrl,\n }}\n size=\"sm\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium\">{row.label}</p>\n <p className=\"text-sm text-muted-foreground\">\n Quando <code className=\"font-mono text-xs\">{row.eventKey}</code> acontece aqui.\n </p>\n </div>\n <span className=\"shrink-0 pt-0.5 text-right text-xs text-muted-foreground\">\n {row.optional\n ? `Opcional — desligue em ${group.connectorName}`\n : `Ligada pela integração · sai ao desconectar ${group.connectorName}`}\n </span>\n </div>\n\n {row.listDeliveries && (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n aria-expanded={open}\n className=\"flex w-full items-center gap-2 border-t border-border px-4 py-2 text-left transition-colors hover:bg-muted/40\"\n >\n <ChevronRight className={`h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform ${open ? 'rotate-90' : ''}`} />\n <span className=\"text-xs font-medium\">O que já foi para o {group.connectorName}</span>\n </button>\n {open && (\n <div className=\"border-t border-border p-4\">\n <ConnectorDeliveries\n load={(options) => row.listDeliveries!({ ...options, eventKey: row.eventKey })}\n providerName={group.connectorName}\n />\n </div>\n )}\n </>\n )}\n </Card>\n )\n}\n","import React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport { ChevronRight, Mail, Megaphone, MessageSquare, Receipt, Smartphone, WandSparkles, Zap } from 'lucide-react'\nimport { Card, PageHeaderActions, PageTabs, Switch, toast, WhatsAppIcon } from '@fayz-ai/ui'\nimport {\n adminNavigateTo, useConnectors, askAI, PageActions, RightRailPage, SettingsTabs, useAgentSurface,\n type AgentSurfaceContribution,\n} from '@fayz-ai/admin'\nimport type { PluginAITool } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// A lista inteira, entregue ao assistente.\n//\n// Da lista dá para fazer as duas coisas que se faz aqui — ligar/desligar e\n// escrever o texto — sem abrir uma por uma, que é a diferença entre \"revise as\n// mensagens de pedido\" e catorze cliques. Passa pelo MESMO `store.upsert` do\n// interruptor e do botão Salvar.\n//\n// `persist` de propósito, ao contrário da ferramenta da tela de detalhe: aqui o\n// texto vai direto para o registro, sem passar por um editor onde alguém leia\n// antes. A confirmação obrigatória é o que põe uma pessoa entre o modelo e uma\n// mensagem que um cliente vai receber.\n// ---------------------------------------------------------------------------\nconst CONFIGURE_TOOL: PluginAITool = {\n id: 'automations.configure',\n name: 'configureAutomation',\n description:\n 'Turns an automation on or off, and/or rewrites its message. Use the `event` and `channel` values exactly as they appear in the surface state. '\n + 'Placeholders must come from that automation\\'s own list — an invented one renders as literal text in a message a customer reads. '\n + 'To review several, call once per automation.',\n icon: 'Zap',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Automations',\n parameters: {\n type: 'object',\n properties: {\n event: { type: 'string', description: 'Event key from the surface state.' },\n channel: { type: 'string', description: 'Channel of that automation (email | whatsapp | sms | in_app).' },\n enabled: { type: 'boolean', description: 'Turn it on or off. Omit to leave as is.' },\n subject: { type: 'string', description: 'New subject. Email only.' },\n body: { type: 'string', description: 'New message body.' },\n },\n required: ['event', 'channel'],\n },\n}\nimport { AutomationDetailPage } from './AutomationDetailPage'\nimport { resolveMessages, useOrganizationStoreLike } from '../lib/runtime'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport type { MessageChannel, MessageKind, ResolvedMessage } from '@fayz-ai/core'\nimport type { MessageTemplateStore } from '../data/templates'\nimport { connectorAutomationRows } from '../lib/connector-automations'\nimport { ConnectorAutomations } from './ConnectorAutomations'\nimport {\n ProviderTemplateBadge, providerApprovalFor, useProviderTemplates,\n} from './ProviderTemplateStatus'\n\n// ---------------------------------------------------------------------------\n// Automações — quando ISTO acontece, mande AQUILO.\n//\n// Cada linha é uma automação inteira: o gatilho à esquerda, o canal na\n// pastilha, o interruptor à direita. Não existe \"modelo\" separado do \"fluxo\" —\n// um texto sem gatilho nunca sai, e um fluxo de um passo é o texto com o\n// gatilho escrito na frente.\n//\n// Agrupado por MÓDULO (Loja, CRM, Agenda) e não por canal, porque é assim que a\n// pergunta chega: \"o que a gente manda quando um pedido é enviado?\" — e a\n// resposta pode ser um e-mail, um WhatsApp, ou os dois. Separar por canal, como\n// fazia a tela de e-mails, obriga a visitar dois menus para responder isso.\n//\n// Cada linha é um par evento×canal. O evento aparece uma vez, com uma pastilha\n// por canal ofertado: é o desenho que o RD Station e o Kommo usam para não\n// esconder que \"confirmação de pedido\" e \"confirmação por WhatsApp\" são o mesmo\n// gatilho com duas saídas.\n//\n// Duas fontes de linha, e não uma: além das mensagens, as automações que uma\n// integração conectada é dona — ../lib/connector-automations.ts diz por quê.\n// ---------------------------------------------------------------------------\n\n// A porta de IA desta tela, fora do JSX para a ação poder ser declarada.\nconst ASK_AI_ACTION = {\n label: 'Criar com IA',\n hint: 'O que revisar nas automações…',\n intro: {\n role: 'setup' as const,\n persona: 'Redator das automações',\n pitch: 'Diga o que revisar nas automações.',\n description:\n 'Vejo todas as automações deste app, quais estão ligadas e o texto de cada uma. Posso ligar, desligar e reescrever — em uma ou em várias de uma vez. Você confirma cada mudança.',\n suggestions: [\n { label: 'Revise as mensagens de pedido no tom da minha marca' },\n { label: 'Ligue as automações de entrega' },\n { label: 'Deixe as mensagens de WhatsApp mais curtas' },\n ],\n },\n}\n\nconst CHANNEL_ICON: Record<MessageChannel, React.ComponentType<{ className?: string }>> = {\n email: Mail,\n // The brand glyph, not a generic bubble: in a list of channels, WhatsApp\n // is recognized by its mark before its label.\n whatsapp: WhatsAppIcon,\n sms: Smartphone,\n push: MessageSquare,\n webchat: MessageSquare,\n}\n\nconst CHANNEL_LABEL: Record<MessageChannel, string> = {\n email: 'E-mail', whatsapp: 'WhatsApp', sms: 'SMS', push: 'Push', webchat: 'Chat',\n}\n\nconst KIND_TABS: { value: MessageKind | 'all'; label: string; icon: React.ComponentType<{ className?: string }> }[] = [\n { value: 'all', label: 'Todos', icon: Zap },\n { value: 'transactional', label: 'Transacionais', icon: Receipt },\n { value: 'marketing', label: 'Marketing', icon: Megaphone },\n]\n\nconst KIND_HINT: Record<string, string> = {\n all: 'Tudo que o produto sabe enviar, por qualquer canal.',\n transactional: 'Disparados por uma ação da pessoa. Não precisam de opt-in.',\n marketing: 'Iniciativa da empresa. Só para quem aceitou receber.',\n}\n\nfunction iconFor(name?: string): React.ComponentType<{ className?: string }> {\n if (!name) return Zap\n const icons = LucideIcons as unknown as Record<string, React.ComponentType<{ className?: string }>>\n return icons[name] ?? Zap\n}\n\n/**\n * Qual automação a URL está pedindo. `null` = nenhuma, e a coluna fica com o\n * assistente.\n *\n * A URL continua sendo a verdade mesmo com o detalhe na coluna: é o que faz o\n * link direto funcionar e o botão voltar do navegador FECHAR o painel em vez de\n * sair da lista.\n */\nfunction readSelection(basePath: string): { eventKey: string; channel: string } | null {\n const hash = window.location.hash.slice(1) || '/'\n if (!hash.startsWith(basePath + '/')) return null\n const [eventKey, channel] = hash.slice(basePath.length + 1).split('/')\n if (!eventKey || !channel) return null\n return { eventKey, channel }\n}\n\nexport function AutomationsList({ store, variant = 'page', basePath = '/automations' }: {\n store: MessageTemplateStore\n /**\n * Onde esta lista mora, e portanto sob que caminho o detalhe abre.\n *\n * A lista pode estar no menu (`/automations`) ou dentro de Configurações\n * (`/settings/automations`) — e o detalhe tem que abrir SOB ela, senão clicar\n * numa linha dentro de Configurações jogava a pessoa para fora da tela em que\n * ela estava.\n */\n basePath?: string\n /**\n * Onde a lista está montada, e portanto que faixa de abas ela desenha.\n *\n * 'page' a tela é dela: a faixa é a sub-cabeça do módulo, sangra até as\n * bordas e sua régua encontra a barra da shell.\n * 'panel' ela é o conteúdo de uma aba de Configurações, onde a shell já\n * escreveu \"← Configurações / Automações\". Aí vale a MESMA faixa dos\n * outros painéis de configuração (Agenda, CRM, Formulários), que\n * começa e termina onde o conteúdo começa e termina.\n */\n variant?: 'page' | 'panel'\n}) {\n const tenantId = useOrganizationStoreLike()\n // Os eventos vêm do runtime: só os plugins ATIVOS anunciam fatos.\n const runtime = usePluginRuntimeOptional()\n const [messages, setMessages] = React.useState<ResolvedMessage[] | null>(null)\n const [kind, setKind] = React.useState<MessageKind | 'all'>('all')\n // A segunda fonte de linhas: as automações que a integração é dona. Mesmo\n // loader dos conectores — duas leituras seriam duas respostas para \"o Google\n // Calendar está ligado?\". Sem grants e sem catálogo: nada disso vira linha\n // aqui, e assim a tela não faz rede nenhuma.\n const { connectors } = useConnectors({ includeGrants: false, includeCatalog: false })\n const owned = React.useMemo(() => connectorAutomationRows(connectors ?? []), [connectors])\n // O que a Meta respondeu sobre cada modelo de WhatsApp. Uma leitura por tela,\n // e sem ela a lista continua inteira — só sem a pastilha.\n const providerTemplates = useProviderTemplates()\n\n // A automação aberta na coluna da direita, lida da URL.\n const [selected, setSelected] = React.useState(() => readSelection(basePath))\n React.useEffect(() => {\n const sync = () => setSelected(readSelection(basePath))\n sync()\n window.addEventListener('hashchange', sync)\n return () => window.removeEventListener('hashchange', sync)\n }, [basePath])\n\n const reload = React.useCallback(async () => {\n // Uma leitura que falha ainda mostra o catálogo inteiro nos padrões: os\n // eventos são código, então \"sem personalização\" é um estado válido e\n // completo, não uma tela vazia.\n let overrides: Awaited<ReturnType<MessageTemplateStore['list']>> = []\n try {\n overrides = await store.list(tenantId)\n } catch (err) {\n console.warn('[automations] could not load template overrides; showing defaults', err)\n }\n setMessages(resolveMessages(overrides, runtime?.events ?? []))\n }, [store, tenantId, runtime])\n\n React.useEffect(() => { void reload() }, [reload])\n\n // --- assistant surface ---------------------------------------------------\n const surfaceRef = React.useRef({ messages, store, tenantId, reload, basePath })\n surfaceRef.current = { messages, store, tenantId, reload, basePath }\n\n const agentSurface = React.useMemo<AgentSurfaceContribution>(() => ({\n id: 'automations.list',\n pluginId: 'automations',\n instructions:\n 'The user is on the automations list. `automations` in the surface state is the complete set — use each entry\\'s `event` and `channel` verbatim, and each entry\\'s own `placeholders` when rewriting its text. '\n + 'Call configureAutomation once per automation you change; say afterwards which ones you touched.',\n describe: () => {\n const o = surfaceRef.current\n return {\n title: 'Automações',\n state: {\n automations: (o.messages ?? []).map((m) => ({\n event: m.event.name,\n title: m.event.title,\n channel: m.channel,\n enabled: m.enabled,\n customized: Boolean(m.customized),\n subject: m.subject,\n body: m.body,\n // `fields` é o contrato do evento — os mesmos descritores que viram\n // as merge fields do editor. É de lá que saem os placeholders.\n placeholders: (m.event.fields ?? []).map((f) => `{{${f.name}}}`),\n })),\n },\n }\n },\n tools: [{\n tool: CONFIGURE_TOOL,\n execute: async (args: Record<string, unknown>) => {\n const o = surfaceRef.current\n const found = (o.messages ?? []).find(\n (m) => m.event.name === args.event && m.channel === args.channel,\n )\n if (!found) {\n return {\n ok: false,\n error: 'unknown_automation',\n available: (o.messages ?? []).map((m) => `${m.event.name}/${m.channel}`),\n }\n }\n try {\n await o.store.upsert({\n eventKey: found.event.name,\n channel: found.channel,\n ...(args.enabled === undefined ? {} : { enabled: Boolean(args.enabled) }),\n ...(args.subject === undefined ? {} : { subject: String(args.subject) }),\n ...(args.body === undefined ? {} : { body: String(args.body) }),\n }, o.tenantId)\n await o.reload()\n // `ref.path` decorates the reply with a goto chip (RecordChip) — the\n // user lands on what the agent just changed. `path`, not archetype:\n // an automation is a settings destination, not a record.\n return {\n ok: true,\n event: found.event.name,\n channel: found.channel,\n ref: {\n id: `${found.event.name}/${found.channel}`,\n label: `${found.event.title ?? found.event.name} — ${CHANNEL_LABEL[found.channel] ?? found.channel}`,\n path: `${o.basePath}/${encodeURIComponent(found.event.name)}/${found.channel}`,\n },\n }\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) }\n }\n },\n }],\n }), [])\n useAgentSurface(agentSurface)\n\n const toggle = async (m: ResolvedMessage, enabled: boolean) => {\n setMessages((prev) => prev?.map((x) =>\n x.event.name === m.event.name && x.channel === m.channel ? { ...x, enabled } : x) ?? null)\n try {\n await store.upsert({ eventKey: m.event.name, channel: m.channel, enabled }, tenantId)\n await reload()\n } catch (err) {\n console.warn('[automations] toggle failed', err)\n toast.error('Não foi possível salvar')\n await reload()\n }\n }\n\n const visible = (messages ?? []).filter((m) => kind === 'all' || m.kind === kind)\n // As linhas do conector não são mensagens, então não têm \"kind\" — aparecem na\n // aba Todos. Contam no total porque estão rodando: omiti-las faria o contador\n // dizer menos automações ativas do que o negócio tem.\n const ownedVisible = kind === 'all' ? owned : []\n const activeCount = (messages ?? []).filter((m) => m.enabled).length + owned.length\n const totalCount = (messages?.length ?? 0) + owned.length\n\n // Agrupa por módulo preservando a ordem de registro dos plugins.\n const groups: { module: string; label: string; items: ResolvedMessage[] }[] = []\n for (const m of visible) {\n let g = groups.find((x) => x.module === m.event.pluginId)\n if (!g) { g = { module: m.event.pluginId, label: m.event.pluginName, items: [] }; groups.push(g) }\n g.items.push(m)\n }\n\n const counter = messages !== null && (\n <span className=\"text-sm text-muted-foreground\">\n {activeCount} de {totalCount} automações ativas\n </span>\n )\n\n return (\n <div className=\"space-y-6\">\n {/* Declarado, não desenhado: o <AskAIButton> cru ficava no cabeçalho no\n celular, onde toda outra tela já entrega a ação ao polegar. */}\n {variant !== 'panel' ? (\n <PageHeaderActions>\n <PageActions\n actions={[{\n id: 'automations-ai',\n label: ASK_AI_ACTION.label,\n icon: WandSparkles,\n intent: 'primary',\n creates: true,\n onSelect: () => askAI({ hint: ASK_AI_ACTION.hint, intro: ASK_AI_ACTION.intro }),\n }]}\n />\n </PageHeaderActions>\n ) : null}\n\n {variant === 'panel' ? (\n <SettingsTabs\n tabs={KIND_TABS.map((t) => ({ id: t.value, label: t.label, IconComp: t.icon }))}\n value={kind}\n onChange={(id) => setKind(id as MessageKind | 'all')}\n aria-label=\"Automações\"\n actions={counter}\n />\n ) : (\n /* Mesma faixa das listas e da sub-nav de módulo. */\n <PageTabs\n className=\"mb-0\"\n tabs={KIND_TABS.map((t) => ({ value: t.value, label: t.label, icon: t.icon }))}\n value={kind}\n onChange={setKind}\n aria-label=\"Automações\"\n actions={counter}\n />\n )}\n\n <p className=\"text-sm text-muted-foreground\">{KIND_HINT[kind]}</p>\n\n {messages === null ? (\n <div className=\"space-y-3\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Card key={i} className=\"p-4\">\n <div className=\"h-4 w-40 animate-pulse rounded bg-muted\" />\n <div className=\"mt-2 h-3 w-64 animate-pulse rounded bg-muted\" />\n </Card>\n ))}\n </div>\n ) : groups.length === 0 && ownedVisible.length === 0 ? (\n <Card className=\"flex flex-col items-center gap-1 p-12 text-center\">\n <Zap className=\"mb-2 h-9 w-9 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-base font-semibold\">Nenhuma automação nesta aba</p>\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n Os eventos vêm dos módulos instalados — a loja traz os do pedido, o CRM os do funil.\n </p>\n </Card>\n ) : groups.map((group) => (\n <div key={group.module} className=\"space-y-3\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </p>\n {group.items.map((m) => {\n const Icon = iconFor(m.event.icon ?? m.event.pluginIcon)\n const ChannelIcon = CHANNEL_ICON[m.channel]\n const href = `${basePath}/${encodeURIComponent(m.event.name)}/${m.channel}`\n // A linha cujo detalhe está aberto na coluna ao lado. Sem a marca,\n // com o rail aberto a lista não diz de QUEM ele fala.\n const isOpen = selected != null\n && decodeURIComponent(selected.eventKey) === m.event.name\n && selected.channel === m.channel\n return (\n <Card\n key={`${m.event.name}:${m.channel}`}\n role=\"button\"\n tabIndex={0}\n aria-current={isOpen || undefined}\n onClick={() => adminNavigateTo(href)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); adminNavigateTo(href) }\n }}\n // Outline, not border/ring: the glass surface forces the card's\n // border-color to transparent and owns its box-shadow, so both\n // utilities are silently defeated there. Outline is the one\n // edge the glass system does not touch, and inline style keeps\n // it out of Tailwind's content-scan lottery.\n style={isOpen ? { outline: '2px solid hsl(var(--primary) / 0.65)', outlineOffset: '-2px' } : undefined}\n className={`cursor-pointer overflow-hidden transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-ring ${\n isOpen ? '' : 'hover:border-primary/40'\n }`}\n >\n <div className=\"flex items-start gap-4 p-4\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border text-muted-foreground\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium\">{m.override?.name ?? m.event.title ?? m.event.name}</p>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[11px] text-muted-foreground\">\n <ChannelIcon className=\"h-3 w-3\" />\n {CHANNEL_LABEL[m.channel]}\n </span>\n {m.customized && (\n <span className=\"rounded-full bg-primary/10 px-2 py-0.5 text-[11px] text-primary\">\n personalizado\n </span>\n )}\n {/* Ligado não quer dizer que vai sair: no WhatsApp a Meta\n ainda precisa aprovar o modelo. */}\n <ProviderTemplateBadge\n approval={providerApprovalFor(providerTemplates, m.event.name, m.channel)}\n />\n </div>\n <p className=\"text-sm text-muted-foreground\">{m.event.description}</p>\n <div className=\"mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Zap className=\"h-3 w-3\" />\n {m.event.trigger}\n </span>\n {m.subject && <span className=\"truncate\">Assunto: {m.subject}</span>}\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-3\">\n {/* Switch e não checkbox: isto vale na hora, não quando\n algum Salvar for clicado. */}\n <Switch\n checked={m.enabled}\n onCheckedChange={(next) => void toggle(m, next)}\n label={m.enabled ? 'Ativo' : 'Inativo'}\n aria-label={`${m.event.title} — ${CHANNEL_LABEL[m.channel]}`}\n />\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n </div>\n </Card>\n )\n })}\n </div>\n ))}\n\n {messages !== null && <ConnectorAutomations rows={ownedVisible} />}\n\n {/* O detalhe abre AO LADO da lista, não no lugar dela: escolher o que uma\n automação diz é olhar as outras que já existem, e a tela cheia tirava\n exatamente isso de vista. O nome sai da linha que já está carregada —\n a coluna se nomeia antes de o detalhe terminar de carregar. */}\n {selected && (\n <RightRailPage\n title={\n (messages ?? []).find(\n (m) => m.event.name === decodeURIComponent(selected.eventKey) && m.channel === selected.channel,\n )?.event.title ?? 'Automação'\n }\n open\n onClose={() => adminNavigateTo(basePath)}\n width=\"max-w-2xl\"\n >\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n <AutomationDetailPage\n eventKey={selected.eventKey}\n channel={selected.channel}\n store={store}\n backTo={basePath}\n embedded\n />\n </div>\n </RightRailPage>\n )}\n </div>\n )\n}\n","import { getSupabaseClientOptional, normalizeMessageActions } from '@fayz-ai/core'\nimport type { MessageTemplate, UpsertMessageTemplateInput } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Acesso aos modelos personalizados. Só as PERSONALIZAÇÕES: o catálogo é\n// código, e uma leitura que falha ainda deve mostrar a lista inteira nos\n// padrões — ver `resolveMessages`.\n// ---------------------------------------------------------------------------\n\nconst TABLE = 'plg_automations_templates'\n\nfunction rowToTemplate(row: any): MessageTemplate {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n eventKey: row.event_key,\n channel: row.channel ?? 'email',\n // NULL fica NULL: quem decide o padrão é o catálogo, não este mapeamento.\n // Colapsar para `false` aqui desligaria em silêncio todo modelo cuja linha\n // só existe porque o texto foi editado.\n enabled: row.enabled ?? null,\n // String vazia e NULL significam a mesma coisa — \"sem personalização\" —,\n // senão um assunto apagado sairia em branco em vez de voltar ao padrão.\n subject: row.subject || null,\n body: row.body || null,\n name: row.name || null,\n // NULL fica NULL pelo mesmo motivo do `enabled`; lista vazia é uma escolha\n // (\"sem botões\"), não a ausência de uma.\n actions: normalizeMessageActions(row.actions),\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nexport interface MessageTemplateStore {\n list(tenantId?: string): Promise<MessageTemplate[]>\n upsert(input: UpsertMessageTemplateInput, tenantId?: string): Promise<MessageTemplate>\n /** Descarta a personalização inteira — a linha some e o padrão volta a valer. */\n reset(eventKey: string, channel: string, tenantId?: string): Promise<void>\n}\n\nexport function createSupabaseTemplateStore(): MessageTemplateStore {\n const db = () => {\n const client = getSupabaseClientOptional()\n if (!client) throw new Error('@fayz-ai/plugin-automations: Supabase client not initialized')\n return client as any\n }\n\n return {\n async list(tenantId) {\n let q = db().from(TABLE).select('*')\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToTemplate)\n },\n\n async upsert(input, tenantId) {\n const payload: Record<string, unknown> = {\n tenant_id: tenantId,\n event_key: input.eventKey,\n channel: input.channel,\n }\n // Só o que veio: omitir uma chave tem de significar \"não mexa nisso\",\n // senão salvar o texto apagaria o ligado/desligado junto.\n if (input.enabled !== undefined) payload.enabled = input.enabled\n if (input.subject !== undefined) payload.subject = input.subject\n if (input.body !== undefined) payload.body = input.body\n if (input.name !== undefined) payload.name = input.name\n if (input.actions !== undefined) payload.actions = input.actions\n\n const { data, error } = await db()\n .from(TABLE)\n .upsert(payload, { onConflict: 'tenant_id,event_key,channel' })\n .select().single()\n if (error) throw error\n return rowToTemplate(data)\n },\n\n async reset(eventKey, channel, tenantId) {\n let q = db().from(TABLE).delete().eq('event_key', eventKey).eq('channel', channel)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { error } = await q\n if (error) throw error\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { startEventLog } from '@fayz-ai/core'\nimport { resolveFayzAgentConnection, registerRailPage, type RailPageProps } from '@fayz-ai/admin'\nimport { AutomationsList } from './views/AutomationsList'\nimport { AutomationDetailPage } from './views/AutomationDetailPage'\nimport { createSupabaseTemplateStore, type MessageTemplateStore } from './data/templates'\nimport { createFayzTemplateStore } from './data/fayz'\n\n// ---------------------------------------------------------------------------\n// @fayz-ai/plugin-automations — everything the product SENDS, in one place.\n//\n// ONE automation = when THIS happens, send THAT over THIS channel.\n//\n// Events do NOT live here. Each module DECLARES them in its own manifest\n// (`events`) and the runtime aggregates the active plugins' — the store brings\n// the order's, the CRM the pipeline's. If this screen had to import store and\n// CRM, an app installing only the CRM would carry the store catalog too, and\n// every new module would mean another import in here.\n//\n// The same catalog feeds integrations (webhooks) and audit: three readers of the\n// SAME fact, which is why the message text is not part of it.\n// ---------------------------------------------------------------------------\n\nexport interface AutomationsPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n /**\n * Where the list lives.\n *\n * 'nav' its own menu item (default) — for apps where sending is daily\n * routine, like the store.\n * 'settings' a tab inside settings, no menu item. In a salon the calendar is\n * what runs all day; automations are configured once, and a fixed\n * top-level item charges attention daily for a monthly screen.\n */\n placement?: 'nav' | 'settings'\n scope?: PluginScope\n verticalId?: VerticalId\n /** Swaps data access (tests, mock mode). */\n store?: MessageTemplateStore\n}\n\nexport function createAutomationsPlugin(options?: AutomationsPluginOptions): PluginManifest {\n // Built once per manifest: the store holds no state, and rebuilding it every\n // render would remount the effects that depend on it.\n // Behind a Fayz project the platform executes the automations, so the\n // customisations live there; outside one, the local table keeps working.\n const connection = resolveFayzAgentConnection()\n const store = options?.store\n ?? (connection ? createFayzTemplateStore(connection) : createSupabaseTemplateStore())\n\n // Turns on the trigger history. Idempotent, and from here on EVERY event the\n // app emits is recorded, not only those with a message — it is the same\n // history webhooks and audit read.\n startEventLog()\n\n const inSettings = options?.placement === 'settings'\n\n const ListPage: React.ComponentType<unknown> = () =>\n React.createElement(AutomationsList, { store })\n ListPage.displayName = 'AutomationsList'\n\n // A mesma lista servida DENTRO de Configurações: a shell já nomeou a tela, e\n // as abas têm de ser as dos outros painéis de lá, não a faixa de um módulo.\n // `basePath` leva o detalhe junto — dentro de Configurações ele abre sob\n // `/settings/automations`, para a pessoa não ser jogada para fora da tela.\n const SettingsListPage: React.ComponentType<unknown> = () =>\n React.createElement(AutomationsList, { store, variant: 'panel', basePath: '/settings/automations' })\n SettingsListPage.displayName = 'AutomationsSettings'\n\n // O detalhe, oferecido para quem quiser abri-lo na coluna sem sair da tela em\n // que está. O raio do CRM é o primeiro a pedir: ele aponta para o MESMO fato\n // que a linha do tempo mostra, e mandar a pessoa para outra página para ver\n // \"o que este fato dispara\" custava o funil que ela estava lendo.\n const RailDetail: React.FC<RailPageProps> = ({ params, onClose }) =>\n React.createElement(AutomationDetailPage, {\n eventKey: params.eventKey,\n channel: params.channel,\n store,\n backTo: inSettings ? '/settings/automations' : '/automations',\n embedded: true,\n onDone: onClose,\n })\n RailDetail.displayName = 'AutomationRailDetail'\n registerRailPage('automations.detail', RailDetail)\n\n const READ = { feature: 'automations', action: 'read' as const }\n\n return {\n id: 'automations',\n defaultAgentRole: 'setup',\n name: options?.navLabel ?? 'Automações',\n icon: 'Zap',\n version: '2.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [{ id: 'automations', label: 'Automations', group: 'Automate' }],\n navigation: inSettings ? [] : [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 6,\n label: options?.navLabel ?? 'Automações',\n route: '/automations',\n icon: 'Zap',\n permission: READ,\n indexChild: false,\n },\n ],\n // The SAME list, served inside settings — not a second screen.\n settings: inSettings ? [\n { id: 'automations', label: options?.navLabel ?? 'Automações', icon: 'Zap', component: SettingsListPage, permission: READ },\n ] : [],\n routes: [\n { path: '/automations', component: ListPage, permission: READ },\n // O detalhe de uma automação é a MESMA tela com a coluna da direita\n // aberta — a lista continua atrás dela. Por isso o curinga aponta para o\n // mesmo componente: a shell colapsa '/x' e '/x/*' na mesma chave, então a\n // página não remonta ao abrir o painel (ver AdminShell.routeKey). Um\n // segundo componente aqui traria de volta a troca de tela.\n { path: '/automations/*', component: ListPage, permission: READ },\n ],\n widgets: [],\n }\n}\n\nexport { createSupabaseTemplateStore }\nexport { createFayzTemplateStore } from './data/fayz'\nexport type { MessageTemplateStore }\n// O que a Meta respondeu sobre cada modelo. Exportado porque a decisão \"esta\n// automação de WhatsApp vai mesmo sair?\" é lida fora desta lista — o painel do\n// conector e o provisionamento perguntam a mesma coisa.\nexport {\n loadProviderTemplates, providerTemplateFor, PROVIDER_TEMPLATES_TABLE,\n type ProviderTemplateRow, type ProviderTemplateStatus,\n} from './data/provider-templates'\nexport { providerApprovalFor, type ProviderApproval } from './views/ProviderTemplateStatus'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/payment-preflight.ts","../src/data/test-send.ts","../src/lib/runtime.ts","../src/data/fayz.ts","../src/views/RunLog.tsx","../src/views/whatsapp-preview-bg.ts","../src/data/provider-templates.ts","../src/views/ProviderTemplateStatus.tsx","../src/views/AutomationDetailPage.tsx","../src/lib/connector-automations.ts","../src/views/ConnectorAutomations.tsx","../src/views/AutomationsList.tsx","../src/data/templates.ts","../src/index.ts"],"names":["React","getSupabaseClientOptional","getActiveTenantId","row","jsxs","jsx","Badge","Button","current","Card","Fragment","adminNavigateTo","ChevronRight","CHANNEL_ICON","Mail","WhatsAppIcon","Smartphone","MessageSquare","CHANNEL_LABEL","Zap","usePluginRuntimeOptional","useAgentSurface","toast","Switch","resolveFayzAgentConnection"],"mappings":"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","file":"index.js","sourcesContent":["// \"Can this app take a Pix?\" — asked here so the editor does not offer a button\n// that would produce a charge nobody can open.\n//\n// ── Why this is a second copy ───────────────────────────────────────────────\n// The function is `tyxter-payment-preflight`, it is OWNED by plugin-conversations\n// (which ships its source and declares it in its manifest), and that plugin\n// exports a richer reader of the same answer. This is not that reader, because\n// plugins in this repo do not depend on one another — there is no\n// @fayz-ai/plugin-conversations in this package.json and adding one would make\n// the automations screen refuse to build in an app that installs automations\n// without the inbox.\n//\n// So the shared thing is the FUNCTION, and the duplicated thing is one invoke.\n// The half that could drift — what \"ready\" means, which modes count — is the\n// function's answer, not this file's opinion.\n//\n// Absence is not failure: an app with no WhatsApp connector at all gets a null\n// readiness, and the editor shows the pay action disabled with a reason rather\n// than an error.\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\nimport * as React from 'react'\n\nconst PREFLIGHT_FUNCTION = 'tyxter-payment-preflight'\n\nexport interface PaymentReadiness {\n ready: boolean\n status: string\n /** 'abacate_pay' is production; 'sandbox_default' works end to end with money\n * that is not real; null means nothing is selected behind the channel. */\n mode: string | null\n sandbox: boolean\n reason: string | null\n}\n\ninterface MinimalClient {\n functions: {\n invoke: (name: string, options: { body: unknown }) => Promise<{ data: unknown; error: unknown }>\n }\n}\n\nasync function readReadiness(): Promise<PaymentReadiness | null> {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n const tenantId = getActiveTenantId()\n if (!supabase || !tenantId) return null\n const { data, error } = await supabase.functions.invoke(PREFLIGHT_FUNCTION, {\n body: { action: 'status', tenantId },\n })\n if (error) return null\n const payments = (data as { payments?: PaymentReadiness } | null)?.payments\n return payments ?? null\n}\n\n/** Ready AND with a rail actually selected. See PaymentReadiness.mode. */\nexport function canOfferPayment(readiness: PaymentReadiness | null): boolean {\n return Boolean(readiness?.ready) && readiness?.mode !== null && readiness?.mode !== undefined\n}\n\n/**\n * One read per screen, never thrown.\n *\n * `loading` is distinguished from \"not ready\" on purpose: a pay toggle that\n * flickers from enabled to disabled while an edge function answers is a toggle\n * somebody clicks in the gap.\n */\nexport function usePaymentReadiness(): { readiness: PaymentReadiness | null; loading: boolean } {\n const [readiness, setReadiness] = React.useState<PaymentReadiness | null>(null)\n const [loading, setLoading] = React.useState(true)\n\n React.useEffect(() => {\n let cancelled = false\n void readReadiness()\n .then((value) => { if (!cancelled) setReadiness(value) })\n .catch(() => { /* absence is not failure */ })\n .finally(() => { if (!cancelled) setLoading(false) })\n return () => { cancelled = true }\n }, [])\n\n return { readiness, loading }\n}\n","// \"Enviar teste\" — the message, sent for real, to the operator's own phone.\n//\n// Same function, same template resolution, same sender resolution as the\n// automation's send (`messaging-send`); the only differences are who is calling\n// (the operator's session instead of the platform secret) and the subject type,\n// which is forced to 'test' so a tapped Confirmar on the test message routes\n// nowhere. A preview that renders locally can lie about template approval and\n// sender state — a test that walks the real path cannot.\nimport { getActiveTenantId, getSupabaseClientOptional } from '@fayz-ai/core'\n\nconst SEND_FUNCTION = 'messaging-send'\n\ninterface MinimalClient {\n functions: {\n invoke: (name: string, options: { body: unknown }) => Promise<{ data: unknown; error: unknown }>\n }\n}\n\nexport interface TestSendResult {\n ok: boolean\n /** A code the editor can phrase: 'template_not_approved', 'no_sender', … */\n error?: string\n message?: string\n}\n\nfunction readFunctionError(error: unknown, data: unknown): TestSendResult {\n const payload = (data ?? null) as { error?: string; message?: string } | null\n if (payload?.error) return { ok: false, error: payload.error, message: payload.message }\n const context = (error as { context?: { error?: string; message?: string } } | null)?.context\n if (context?.error) return { ok: false, error: context.error, message: context.message }\n return { ok: false, error: 'send_failed', message: error instanceof Error ? error.message : undefined }\n}\n\nexport async function sendTestMessage(input: {\n eventKey: string\n channel: string\n to: string\n variables: Record<string, string>\n /** Email only: send this draft instead of the saved template row. */\n template?: { subject: string; body: string }\n}): Promise<TestSendResult> {\n const supabase = getSupabaseClientOptional() as MinimalClient | null\n const tenantId = getActiveTenantId()\n if (!supabase || !tenantId) return { ok: false, error: 'not_available' }\n const { data, error } = await supabase.functions.invoke(SEND_FUNCTION, {\n body: {\n test: true,\n tenantId,\n channel: input.channel,\n eventKey: input.eventKey,\n to: input.to,\n variables: input.variables,\n subject: { type: 'test', id: crypto.randomUUID() },\n ...(input.template ? { template: input.template } : {}),\n },\n })\n if (error || (data as { error?: string } | null)?.error) return readFunctionError(error, data)\n return { ok: true }\n}\n","import { useOrganizationStore } from '@fayz-ai/admin'\n\n// Re-exports para as views não precisarem saber de onde vem cada peça.\nexport {\n resolveMessages, resolveMessage, renderMessageTemplate,\n getEventsWithoutMessages,\n} from '@fayz-ai/core'\n\n/** Conta ativa — todo modelo é escopado nela. */\nexport function useOrganizationStoreLike(): string | undefined {\n return useOrganizationStore((s) => s.currentOrg?.id)\n}\n","import { getFayzSupabaseClientOptional } from '@fayz-ai/admin'\nimport type { ResolvedFayzAgentConnection } from '@fayz-ai/admin'\nimport { getMessageDefaults } from '@fayz-ai/core'\nimport type { MessageChannel, MessageTemplate } from '@fayz-ai/core'\nimport {\n createFayzAutomationsClient,\n FayzAutomationsError,\n type FayzAutomation,\n type FayzAutomationsClient,\n} from '@fayz-ai/sdk/automations'\nimport type { MessageTemplateStore } from './templates'\n\n// ---------------------------------------------------------------------------\n// The SAME contract as `templates.ts`, served by the platform: behind a Fayz\n// project the platform is what runs the automations, so the customisation has\n// to live there — a local row the platform never reads is a fake switch.\n// ---------------------------------------------------------------------------\n\nfunction toTemplate(automation: FayzAutomation): MessageTemplate | null {\n const eventKey = automation.triggerConfig?.eventKey\n // No eventKey means it isn't a catalogue automation — standalone platform\n // flows have no row on this screen.\n if (!eventKey) return null\n const action = automation.actions?.[0]\n return {\n id: automation.id,\n tenantId: automation.tenantId ?? '',\n eventKey,\n channel: (automation.triggerConfig.sourceChannel ?? 'email') as MessageChannel,\n enabled: automation.enabled,\n // Empty and absent mean the same — \"no customisation\", the catalogue default.\n subject: action?.config?.subject || null,\n body: action?.config?.body || null,\n // The automation name belongs to the platform, not a user rename: the\n // catalogue title still owns the screen.\n name: null,\n // The platform's automation action carries a subject and a body and nothing\n // else, so there is nowhere for a customised button to live yet. NULL, not\n // [], because the catalogue default is what still applies — an empty list\n // would read as \"this tenant removed the buttons\".\n actions: null,\n updatedAt: automation.updatedAt,\n }\n}\n\nfunction catalogDefaultEnabled(eventKey: string, channel: MessageChannel): boolean {\n const def = getMessageDefaults().find((d) => d.eventKey === eventKey)\n return def?.defaultEnabled?.[channel] ?? false\n}\n\nasync function defaultSessionToken(): Promise<string | null> {\n const session = (await getFayzSupabaseClientOptional()?.auth.getSession())?.data.session\n return session?.access_token ?? null\n}\n\nexport interface FayzTemplateStoreDeps {\n client?: FayzAutomationsClient\n getSessionToken?: () => Promise<string | null>\n}\n\nexport function createFayzTemplateStore(\n connection: ResolvedFayzAgentConnection,\n deps: FayzTemplateStoreDeps = {},\n): MessageTemplateStore {\n const client = deps.client ?? createFayzAutomationsClient({\n baseUrl: connection.apiBaseUrl,\n projectId: connection.projectId,\n publishableKey: connection.publishableKey,\n })\n const getSessionToken = deps.getSessionToken ?? defaultSessionToken\n\n // (event_key, channel) → platform automation id, repopulated on every list.\n const ids = new Map<string, string>()\n const keyOf = (eventKey: string, channel: string) => `${eventKey}:${channel}`\n\n async function refresh(tenantId: string): Promise<MessageTemplate[]> {\n const automations = await client.list({ tenantId })\n ids.clear()\n const rows: MessageTemplate[] = []\n for (const automation of automations) {\n const row = toTemplate(automation)\n if (!row) continue\n ids.set(keyOf(row.eventKey, row.channel), automation.id)\n rows.push(row)\n }\n return rows\n }\n\n // One screen mounts several views of the same catalogue (list, detail, CRM ⚡)\n // and StrictMode doubles effects in dev — unshared, opening it costs 8+ identical\n // GETs. One flight per tenant, short-lived; writes invalidate.\n const LIST_TTL_MS = 30_000\n let cache: { tenantId: string; at: number; promise: Promise<MessageTemplate[]> } | null = null\n\n function invalidate(): void {\n cache = null\n }\n\n function load(tenantId: string): Promise<MessageTemplate[]> {\n if (cache && cache.tenantId === tenantId && Date.now() - cache.at < LIST_TTL_MS) return cache.promise\n const promise = refresh(tenantId)\n promise.catch(() => {\n if (cache?.promise === promise) cache = null // a failure must not stay cached for 30s\n })\n cache = { tenantId, at: Date.now(), promise }\n return promise\n }\n\n async function requireToken(): Promise<string> {\n const token = await getSessionToken()\n // Writing needs the app session — same message as the rest of the admin.\n if (!token) throw new Error('Sessão expirada — entre de novo.')\n return token\n }\n\n async function resolveId(eventKey: string, channel: string, tenantId: string): Promise<string | undefined> {\n const key = keyOf(eventKey, channel)\n if (!ids.has(key)) await load(tenantId)\n return ids.get(key)\n }\n\n return {\n async list(tenantId) {\n // No account yet, nothing to ask — the catalogue at its defaults is a\n // complete state, same as the local store when the read fails.\n if (!tenantId) return []\n return load(tenantId)\n },\n\n async upsert(input, tenantId) {\n if (!tenantId) throw new Error('@fayz-ai/plugin-automations: tenantId is required')\n const appSessionToken = await requireToken()\n const key = keyOf(input.eventKey, input.channel)\n let id = await resolveId(input.eventKey, input.channel, tenantId)\n\n if (!id) {\n const action: { subject?: string; body?: string } = {}\n if (input.subject != null) action.subject = input.subject\n if (input.body != null) action.body = input.body\n try {\n const created = await client.create({\n tenantId,\n appSessionToken,\n eventKey: input.eventKey,\n sourceChannel: input.channel,\n // The platform has no \"inherit from catalogue\": materialise the default.\n enabled: input.enabled ?? catalogDefaultEnabled(input.eventKey, input.channel),\n ...(Object.keys(action).length ? { action } : {}),\n })\n ids.set(key, created.id)\n invalidate()\n const row = toTemplate(created)\n if (!row) throw new Error('@fayz-ai/plugin-automations: platform did not round-trip eventKey')\n return row\n } catch (err) {\n // 409: someone created it first — turn it into an update.\n if (!(err instanceof FayzAutomationsError) || err.status !== 409) throw err\n invalidate()\n await refresh(tenantId)\n id = ids.get(key)\n if (!id) throw err\n }\n }\n\n const updated = await client.update({\n id,\n tenantId,\n appSessionToken,\n // Only what was sent: omitting has to mean \"leave it alone\", as in the local store.\n ...(typeof input.enabled === 'boolean' ? { enabled: input.enabled } : {}),\n ...(input.subject !== undefined || input.body !== undefined\n ? {\n action: {\n ...(input.subject !== undefined ? { subject: input.subject } : {}),\n ...(input.body !== undefined ? { body: input.body } : {}),\n },\n }\n : {}),\n })\n invalidate()\n const row = toTemplate(updated)\n if (!row) throw new Error('@fayz-ai/plugin-automations: platform did not round-trip eventKey')\n return row\n },\n\n async reset(eventKey, channel, tenantId) {\n if (!tenantId) return\n const id = await resolveId(eventKey, channel, tenantId)\n // Never customised: the default already applies, nothing to clear.\n if (!id) return\n const appSessionToken = await requireToken()\n // The automation stays (the on/off belongs to it); only the text goes back\n // to the catalogue — null clears the field on the server.\n await client.update({ id, tenantId, appSessionToken, action: { subject: null, body: null } })\n invalidate()\n },\n }\n}\n\nlet cachedClient: { key: string; client: FayzAutomationsClient } | null = null\n\n/** One client per connection — RunLog and the store read the same surface. */\nexport function getFayzAutomationsClient(connection: ResolvedFayzAgentConnection): FayzAutomationsClient {\n const key = `${connection.apiBaseUrl}|${connection.projectId}|${connection.publishableKey}`\n if (cachedClient?.key === key) return cachedClient.client\n const client = createFayzAutomationsClient({\n baseUrl: connection.apiBaseUrl,\n projectId: connection.projectId,\n publishableKey: connection.publishableKey,\n })\n cachedClient = { key, client }\n return client\n}\n","import React from 'react'\nimport { AlertTriangle, ChevronRight, CircleCheck, CircleSlash, History, RefreshCw } from 'lucide-react'\nimport { Badge, Button, Card } from '@fayz-ai/ui'\nimport { loadEventRuns, type EventRun, type EventRunStatus } from '@fayz-ai/core'\nimport type { ResolvedFayzAgentConnection } from '@fayz-ai/admin'\nimport type { FayzAutomationExecution } from '@fayz-ai/sdk/automations'\nimport { getFayzAutomationsClient } from '../data/fayz'\n\n// ---------------------------------------------------------------------------\n// The last runs of this trigger.\n//\n// The screen said what SHOULD happen, never what DID — so testing an automation\n// meant waiting for a customer complaint, and a complaint can't tell \"never\n// fired\" from \"fired and the send failed\", which are defects in different\n// places. The payload stays visible (collapsed) on purpose: it answers \"why did\n// it go out with the wrong name?\" without reproducing the case.\n//\n// Works for ANY trigger: the list is read by event key and every emitted event\n// goes through the same collector, so a new module shows up here untouched.\n// ---------------------------------------------------------------------------\n\nconst STATUS: Record<EventRunStatus, {\n label: string; hint: string; variant: 'success' | 'info' | 'warning' | 'destructive'\n Icon: React.ComponentType<{ className?: string }>\n}> = {\n sent: { label: 'Enviado', hint: 'A mensagem saiu.', variant: 'success', Icon: CircleCheck },\n recorded: {\n label: 'Disparou',\n // Today's honest state: the trigger works, the send doesn't exist yet.\n hint: 'O gatilho disparou e ficou registrado. O envio automático ainda não está ligado neste ambiente.',\n variant: 'info', Icon: History,\n },\n skipped: { label: 'Ignorado', hint: 'O gatilho disparou, mas nada foi enviado — automação desligada ou sem canal.', variant: 'warning', Icon: CircleSlash },\n failed: { label: 'Falhou', hint: 'A tentativa de envio quebrou. O erro está na linha.', variant: 'destructive', Icon: AlertTriangle },\n}\n\nfunction when(iso: string): string {\n const then = new Date(iso).getTime()\n const diff = Date.now() - then\n const min = Math.round(diff / 60000)\n if (min < 1) return 'agora'\n if (min < 60) return `há ${min} min`\n const h = Math.round(min / 60)\n if (h < 24) return `há ${h} h`\n return new Date(iso).toLocaleString('pt-BR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' })\n}\n\nfunction RunRow({ run }: { run: EventRun }) {\n const [open, setOpen] = React.useState(false)\n const cfg = STATUS[run.status] ?? STATUS.recorded\n const { Icon } = cfg\n\n return (\n <div className=\"border-b border-border last:border-b-0\">\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n className=\"flex w-full items-center gap-3 px-4 py-2.5 text-left transition-colors hover:bg-muted/40\"\n >\n <ChevronRight className={`h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform ${open ? 'rotate-90' : ''}`} />\n <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <Badge variant={cfg.variant}>{cfg.label}</Badge>\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted-foreground\">\n {typeof run.payload.record_name === 'string' ? run.payload.record_name\n : typeof run.payload.customer_name === 'string' ? run.payload.customer_name\n : typeof run.payload.contact_name === 'string' ? run.payload.contact_name\n : run.subjectId ?? '—'}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{when(run.occurredAt)}</span>\n </button>\n\n {open && (\n <div className=\"space-y-3 bg-muted/20 px-4 pb-4 pt-1\">\n <p className=\"text-xs text-muted-foreground\">{cfg.hint}</p>\n <div>\n <p className=\"mb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Dados do disparo\n </p>\n <pre className=\"overflow-x-auto rounded-md border border-border bg-card p-3 font-mono text-[11px] leading-relaxed\">\n{JSON.stringify(run.payload, null, 2)}\n </pre>\n </div>\n {run.result && (\n <div>\n <p className=\"mb-1 text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n Resultado\n </p>\n <pre className=\"overflow-x-auto rounded-md border border-border bg-card p-3 font-mono text-[11px] leading-relaxed\">\n{JSON.stringify(run.result, null, 2)}\n </pre>\n </div>\n )}\n {run.error && (\n <p className=\"rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 font-mono text-[11px] text-destructive\">\n {run.error}\n </p>\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport function RunLog({ eventKey, tenantId, enabled }: {\n eventKey: string\n tenantId?: string\n /** Current automation state — changes what the empty state means. */\n enabled: boolean\n}) {\n const [runs, setRuns] = React.useState<EventRun[] | null>(null)\n const [loading, setLoading] = React.useState(false)\n\n const load = React.useCallback(async () => {\n setLoading(true)\n setRuns(await loadEventRuns(eventKey, { tenantId, limit: 20 }))\n setLoading(false)\n }, [eventKey, tenantId])\n\n React.useEffect(() => { void load() }, [load])\n\n return (\n <Card className=\"overflow-hidden\">\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-4 py-2.5\">\n <div className=\"min-w-0\">\n <span className=\"text-sm font-medium\">Execuções recentes</span>\n <p className=\"text-xs text-muted-foreground\">Cada vez que este gatilho disparou nesta conta.</p>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void load()} disabled={loading}>\n <RefreshCw className={`h-3.5 w-3.5 ${loading ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n\n {runs === null ? (\n <div className=\"space-y-2 p-4\">\n {[1, 2, 3].map((i) => <div key={i} className=\"h-8 animate-pulse rounded bg-muted/40\" />)}\n </div>\n ) : runs.length === 0 ? (\n <div className=\"flex flex-col items-center gap-1 px-4 py-10 text-center\">\n <History className=\"h-7 w-7 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-sm font-medium\">Nenhum disparo ainda</p>\n <p className=\"max-w-sm text-xs text-muted-foreground\">\n {enabled\n ? 'Assim que este evento acontecer, ele aparece aqui — mesmo antes de existir envio.'\n : 'A automação está desligada. O gatilho continua sendo registrado aqui quando o evento acontecer.'}\n </p>\n </div>\n ) : (\n <div>{runs.map((run) => <RunRow key={run.id} run={run} />)}</div>\n )}\n </Card>\n )\n}\n\n// ---------------------------------------------------------------------------\n// The PLATFORM's runs. Behind a Fayz project the send runs there, so the real\n// history is the platform's — the local collector only knows the trigger fired,\n// not what the platform did with it.\n// ---------------------------------------------------------------------------\n\nconst EXEC_STATUS: Record<string, {\n label: string; variant: 'success' | 'info' | 'destructive'\n Icon: React.ComponentType<{ className?: string }>\n}> = {\n success: { label: 'Executada', variant: 'success', Icon: CircleCheck },\n error: { label: 'Falhou', variant: 'destructive', Icon: AlertTriangle },\n}\n\nfunction ExecutionRow({ execution }: { execution: FayzAutomationExecution }) {\n const cfg = EXEC_STATUS[execution.status]\n ?? { label: execution.status, variant: 'info' as const, Icon: History }\n const { Icon } = cfg\n return (\n <div className=\"border-b border-border px-4 py-2.5 last:border-b-0\">\n <div className=\"flex items-center gap-3\">\n <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <Badge variant={cfg.variant}>{cfg.label}</Badge>\n <span className=\"min-w-0 flex-1 truncate text-sm text-muted-foreground\">\n {execution.automationName}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">{when(execution.executedAt)}</span>\n </div>\n {execution.error && (\n <p className=\"ml-6 mt-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 font-mono text-[11px] text-destructive\">\n {execution.error}\n </p>\n )}\n </div>\n )\n}\n\nexport function FayzRunLog({ connection, eventKey, tenantId, enabled }: {\n connection: ResolvedFayzAgentConnection\n eventKey: string\n tenantId?: string\n /** Current automation state — changes what the empty state means. */\n enabled: boolean\n}) {\n const [executions, setExecutions] = React.useState<FayzAutomationExecution[] | null>(null)\n const [loading, setLoading] = React.useState(false)\n\n const load = React.useCallback(async () => {\n if (!tenantId) return\n setLoading(true)\n try {\n setExecutions(await getFayzAutomationsClient(connection).listExecutions({ tenantId, eventKey, limit: 20 }))\n } catch (err) {\n console.warn('[automations] could not load platform executions', err)\n setExecutions([])\n } finally {\n setLoading(false)\n }\n }, [connection, eventKey, tenantId])\n\n React.useEffect(() => { void load() }, [load])\n\n return (\n <Card className=\"overflow-hidden\">\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-4 py-2.5\">\n <div className=\"min-w-0\">\n <span className=\"text-sm font-medium\">Execuções recentes</span>\n <p className=\"text-xs text-muted-foreground\">\n O que a plataforma Fayz executou para este gatilho nesta conta.\n </p>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void load()} disabled={loading}>\n <RefreshCw className={`h-3.5 w-3.5 ${loading ? 'animate-spin' : ''}`} />\n </Button>\n </div>\n\n {executions === null ? (\n <div className=\"space-y-2 p-4\">\n {[1, 2, 3].map((i) => <div key={i} className=\"h-8 animate-pulse rounded bg-muted/40\" />)}\n </div>\n ) : executions.length === 0 ? (\n <div className=\"flex flex-col items-center gap-1 px-4 py-10 text-center\">\n <History className=\"h-7 w-7 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-sm font-medium\">Nenhuma execução ainda</p>\n <p className=\"max-w-sm text-xs text-muted-foreground\">\n {enabled\n ? 'Assim que este evento acontecer, a plataforma executa a automação e o resultado aparece aqui.'\n : 'A automação está desligada — a plataforma não executa nada para este gatilho.'}\n </p>\n </div>\n ) : (\n <div>{executions.map((e) => <ExecutionRow key={e.id} execution={e} />)}</div>\n )}\n </Card>\n )\n}\n","// The real WhatsApp doodle wallpaper, served from the product's own R2 bucket\n// (uploaded by the founder next to the connector marks). One URL beats 39KB of\n// base64 in every app bundle; the preview is an admin surface, always online.\nexport const WHATSAPP_PREVIEW_BG = 'https://assets.fayz.ai/connectors/whatsapp-background.jpg'\n","import { getSupabaseClientOptional } from '@fayz-ai/core'\nimport type { MessageChannel } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// O que a Meta respondeu sobre cada modelo.\n//\n// Só LEITURA. A tabela é escrita pelo webhook e pela função de sincronização,\n// com service role: quem pudesse marcar `approved` daqui faria o envio tentar um\n// modelo que a Meta nunca liberou, e a recusa chegaria como uma confirmação de\n// horário que não saiu.\n//\n// A leitura traz as linhas do tenant E as do produto (tenant_id NULL). São as\n// duas que importam na tela: a mensagem sai pela do produto até a do tenant ser\n// aprovada, então \"aguardando aprovação\" só é verdade quando NENHUMA das duas\n// está aprovada.\n// ---------------------------------------------------------------------------\n\nexport const PROVIDER_TEMPLATES_TABLE = 'plg_automations_provider_templates'\n\nexport type ProviderTemplateStatus =\n | 'draft' | 'submitted' | 'approved' | 'rejected' | 'paused' | 'disabled'\n\nexport interface ProviderTemplateRow {\n id: string\n /** NULL = o modelo padrão do produto, que serve todos os tenants. */\n tenantId: string | null\n eventKey: string\n channel: MessageChannel\n provider: string\n templateName: string\n status: ProviderTemplateStatus\n rejectionReason: string | null\n updatedAt: string | null\n}\n\nfunction rowToProviderTemplate(row: any): ProviderTemplateRow {\n return {\n id: row.id,\n tenantId: row.tenant_id ?? null,\n eventKey: row.event_key,\n channel: (row.channel ?? 'whatsapp') as MessageChannel,\n provider: row.provider ?? 'tyxter',\n templateName: row.template_name ?? '',\n status: (row.status ?? 'draft') as ProviderTemplateStatus,\n rejectionReason: row.rejection_reason || null,\n updatedAt: row.updated_at ?? row.created_at ?? null,\n }\n}\n\n/**\n * Nunca lança: sem cliente, sem tabela ou sem permissão a lista de automações\n * continua inteira, só sem a pastilha de aprovação. Um erro aqui não pode\n * esconder as automações de e-mail, que não dependem da Meta para nada.\n */\nexport async function loadProviderTemplates(): Promise<ProviderTemplateRow[]> {\n const client = getSupabaseClientOptional() as unknown as { from: (t: string) => any } | null\n if (!client) return []\n try {\n // Sem filtro de tenant: a RLS já entrega as linhas deste tenant mais as do\n // produto, e filtrar por tenant aqui esconderia justamente o modelo padrão\n // pelo qual a mensagem sai hoje.\n const { data, error } = await client.from(PROVIDER_TEMPLATES_TABLE).select('*')\n if (error) throw error\n return (data ?? []).map(rowToProviderTemplate)\n } catch (err) {\n console.warn('[automations] could not load provider template status', err)\n return []\n }\n}\n\n/**\n * A linha que decide o que a tela mostra para um (evento × canal).\n *\n * A do tenant ganha quando existe — é a que ele está esperando. Se ela não\n * existe, vale a do produto. E se a do tenant foi recusada mas a do produto está\n * aprovada, a mensagem AINDA SAI (pela do produto): quem escolhe aqui é a linha\n * do tenant, e o texto da pastilha é que diz isso.\n */\nexport function providerTemplateFor(\n rows: ProviderTemplateRow[],\n eventKey: string,\n channel: MessageChannel,\n): { own: ProviderTemplateRow | null; fallback: ProviderTemplateRow | null } {\n const matching = rows.filter((r) => r.eventKey === eventKey && r.channel === channel)\n return {\n own: matching.find((r) => r.tenantId !== null) ?? null,\n fallback: matching.find((r) => r.tenantId === null) ?? null,\n }\n}\n","import React from 'react'\nimport { Badge } from '@fayz-ai/ui'\nimport type { MessageChannel } from '@fayz-ai/core'\nimport {\n loadProviderTemplates, providerTemplateFor,\n type ProviderTemplateRow,\n} from '../data/provider-templates'\n\n// ---------------------------------------------------------------------------\n// \"Ligado\" não quer dizer \"vai sair\".\n//\n// No WhatsApp a mensagem só existe depois que a Meta aprova o modelo, e a\n// aprovação é assíncrona: pode levar horas e pode voltar recusada. Sem esta\n// pastilha a tela mostra um interruptor verde para uma automação que a Meta\n// ainda não liberou — e o negócio só descobre quando a cliente não recebe.\n//\n// Só o WhatsApp tem isso. E-mail não passa por aprovação de ninguém, então a\n// pastilha some nos outros canais em vez de dizer \"aprovado\" sobre algo que\n// nunca precisou ser.\n// ---------------------------------------------------------------------------\n\nexport type ProviderApproval =\n | { tone: 'ok'; label: string; detail?: string }\n | { tone: 'waiting'; label: string; detail?: string }\n | { tone: 'error'; label: string; detail?: string }\n\n/**\n * O que a linha mostra para um (evento × canal).\n *\n * `null` = nada a dizer, e é o caso comum: canal sem aprovação, ou WhatsApp\n * ainda não conectado (sem nenhuma linha, o assunto não existe para este\n * negócio e uma pastilha vermelha seria um alarme sobre algo que ninguém pediu).\n *\n * A regra que decide o texto é a mesma do envio: sai pelo modelo do produto até\n * o do tenant ser aprovado. Por isso um modelo do tenant recusado, com o do\n * produto aprovado, é um AVISO e não uma falha — a mensagem continua saindo.\n */\nexport function providerApprovalFor(\n rows: ProviderTemplateRow[],\n eventKey: string,\n channel: MessageChannel,\n): ProviderApproval | null {\n if (channel !== 'whatsapp') return null\n const { own, fallback } = providerTemplateFor(rows, eventKey, channel)\n const row = own ?? fallback\n if (!row) return null\n\n const fallbackApproved = fallback?.status === 'approved'\n\n switch (row.status) {\n case 'approved':\n return { tone: 'ok', label: 'Aprovado pela Meta' }\n case 'rejected':\n return {\n tone: fallbackApproved && own ? 'waiting' : 'error',\n label: fallbackApproved && own ? 'Seu texto foi recusado' : 'Recusado pela Meta',\n detail: row.rejectionReason\n ? `Motivo: ${row.rejectionReason}`\n : 'A Meta não disse o motivo.',\n }\n case 'paused':\n return {\n tone: 'error',\n label: 'Pausado pela Meta',\n detail: row.rejectionReason ?? 'Costuma ser excesso de marcações de spam pelos clientes.',\n }\n case 'disabled':\n return { tone: 'error', label: 'Desativado pela Meta', detail: row.rejectionReason ?? undefined }\n case 'submitted':\n return {\n tone: 'waiting',\n label: 'Aguardando aprovação da Meta',\n detail: fallbackApproved && own\n ? 'Até lá a mensagem sai com o texto padrão.'\n : 'A revisão costuma levar algumas horas.',\n }\n default:\n return { tone: 'waiting', label: 'Ainda não enviado para aprovação' }\n }\n}\n\nconst TONE_VARIANT: Record<ProviderApproval['tone'], 'success' | 'warning' | 'destructive'> = {\n ok: 'success',\n waiting: 'warning',\n error: 'destructive',\n}\n\nexport function ProviderTemplateBadge({ approval, showDetail }: {\n approval: ProviderApproval | null\n showDetail?: boolean\n}) {\n if (!approval) return null\n // Aprovado não ganha pastilha na lista: é o estado normal, e uma linha em que\n // tudo está certo não precisa de enfeite. O que precisa aparecer é o que\n // impede a mensagem de sair.\n if (approval.tone === 'ok' && !showDetail) return null\n return (\n <span className=\"inline-flex flex-wrap items-center gap-1.5\">\n <Badge variant={TONE_VARIANT[approval.tone]}>{approval.label}</Badge>\n {showDetail && approval.detail && (\n <span className=\"text-xs text-muted-foreground\">{approval.detail}</span>\n )}\n </span>\n )\n}\n\n/** Uma leitura por tela. Nunca lança: sem a tabela, a lista continua inteira. */\nexport function useProviderTemplates(): ProviderTemplateRow[] {\n const [rows, setRows] = React.useState<ProviderTemplateRow[]>([])\n React.useEffect(() => {\n let cancelled = false\n void loadProviderTemplates().then((data) => { if (!cancelled) setRows(data) })\n return () => { cancelled = true }\n }, [])\n return rows\n}\n","import React from 'react'\nimport { Check, Clock, Mail, MessageSquare, Monitor, RotateCcw, Send, Smartphone, Zap } from 'lucide-react'\nimport { Badge, Button, Card, HeaderTabs, Hint, PhoneField, SubpageHeader, Switch, toast, WhatsAppIcon } from '@fayz-ai/ui'\nimport {\n adminNavigateTo, resolveFayzAgentConnection, AskAIButton, useAgentSurface,\n type AgentSurfaceContribution,\n} from '@fayz-ai/admin'\nimport type { MessageAction, MessageActionId, MessageChannel, PluginAITool, ResolvedMessage } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport { canOfferPayment, usePaymentReadiness } from '../data/payment-preflight'\nimport { sendTestMessage } from '../data/test-send'\nimport { resolveMessage, renderMessageTemplate, useOrganizationStoreLike } from '../lib/runtime'\nimport { FayzRunLog, RunLog } from './RunLog'\nimport { WHATSAPP_PREVIEW_BG } from './whatsapp-preview-bg'\nimport {\n ProviderTemplateBadge, providerApprovalFor, useProviderTemplates,\n} from './ProviderTemplateStatus'\nimport type { MessageTemplateStore } from '../data/templates'\n\n// ---------------------------------------------------------------------------\n// Um modelo, em tela cheia. Duas visões do MESMO texto:\n// Prévia o que a pessoa recebe, com os campos já substituídos\n// Código o texto-fonte, onde se edita\n//\n// A substituição da prévia é a de @fayz-ai/core (renderMessageTemplate), não um\n// replace local: prévia e envio precisam concordar, senão aprova-se um texto e\n// entrega-se outro.\n//\n// \"Igual ao padrão\" é gravado como AUSÊNCIA de personalização (null), não como\n// cópia — assim melhorias no texto padrão continuam chegando a quem nunca\n// mexeu. É o mesmo motivo pelo qual \"Restaurar padrão\" APAGA a linha em vez de\n// escrever o texto de fábrica nela.\n// ---------------------------------------------------------------------------\n\ntype ViewTab = 'preview' | 'code' | 'runs' | 'test'\n\n// ---------------------------------------------------------------------------\n// Os botões da mensagem.\n//\n// O catálogo do plugin define os padrões (Confirmar/Cancelar no agendamento);\n// aqui a pessoa liga e desliga cada um. É uma lista fechada porque um botão não\n// é um texto: cada id tem um significado do lado de cá — `confirm` e `cancel`\n// mexem no agendamento, `pay` abre uma cobrança — e um id inventado seria um\n// botão que o cliente toca e nada acontece.\n//\n// `pay` é o único que depende de algo fora deste app, e por isso é o único que\n// pode aparecer desligado por motivo alheio: sem uma conta de pagamento\n// escolhida na Tyxter, a cobrança não abre. Mostrar o botão desabilitado com o\n// motivo é melhor do que escondê-lo — escondido, a pergunta \"cadê o Pix?\" não\n// tem onde ser respondida.\n// ---------------------------------------------------------------------------\nconst ACTION_CATALOG: Array<{ id: MessageActionId; label: string; kind: MessageAction['kind']; hint: string }> = [\n { id: 'confirm', label: 'Confirma', kind: 'reply', hint: 'O cliente confirma o horário no toque.' },\n { id: 'cancel', label: 'Cancela', kind: 'reply', hint: 'O cliente desmarca sem precisar ligar.' },\n { id: 'pay', label: 'Pagar', kind: 'payment', hint: 'O cliente recebe o Pix na conversa.' },\n]\n\n/**\n * A lista de botões depois de ligar ou desligar um deles.\n *\n * A ordem é a do catálogo e não a do clique: os botões chegam ao WhatsApp\n * numerados, e reordená-los ao ligar o terceiro mudaria o que o segundo faz\n * numa mensagem que a Meta já aprovou.\n */\nexport function nextActions(\n current: MessageAction[], id: MessageActionId, on: boolean,\n): MessageAction[] {\n const kept = new Set(current.filter((a) => a.id !== id).map((a) => a.id))\n if (on) kept.add(id)\n const labels = new Map(current.map((a) => [a.id, a.label]))\n return ACTION_CATALOG\n .filter((a) => kept.has(a.id))\n // O rótulo que já existe ganha do padrão: se o texto foi personalizado,\n // ligar outro botão não é hora de reescrevê-lo.\n .map((a) => ({ id: a.id, label: labels.get(a.id) ?? a.label, kind: a.kind }))\n}\n\n// What each refusal of a test send means to the person reading the toast. The\n// codes are messaging-send's own; an unknown one falls back to its message.\nconst TEST_ERROR: Record<string, string> = {\n template_not_approved: 'O modelo ainda não foi aprovado pela Meta — sincronize os modelos e tente de novo.',\n no_sender: 'Este app ainda não tem um número de WhatsApp ativo. Veja Conversas → Tyxter.',\n not_connected: 'O WhatsApp ainda não está conectado neste app. Veja Conversas → Tyxter.',\n contact_opted_out: 'Este contato pediu para não receber mensagens.',\n invalid_recipient: 'Esse destino não parece válido.',\n not_a_member: 'A sua sessão não pertence a este negócio.',\n not_available: 'O envio de teste não está disponível neste ambiente.',\n email_not_configured: 'O envio de e-mail não está configurado neste app.',\n template_not_found: 'Escreva a mensagem antes de testar.',\n email_rejected: 'O provedor de e-mail recusou a mensagem.',\n email_credential_rejected: 'A chave de e-mail do app foi recusada pelo provedor.',\n email_rate_limited: 'O provedor pediu uma pausa — tente de novo em instantes.',\n}\n\n/**\n * O teste que anda o caminho de verdade.\n *\n * A prévia acima substitui variáveis localmente e não pode mentir sobre o texto\n * — mas só o envio real revela o resto: modelo aprovado, número ativo, chave da\n * plataforma. Por isso o teste chama a MESMA função do envio da automação, com\n * a sessão da pessoa no lugar do segredo da plataforma e um assunto 'test' que\n * nenhum botão consegue transformar em ação sobre um registro real.\n */\nfunction TestSendStrip({ eventKey, channel, placeholders, template }: {\n eventKey: string\n channel: MessageChannel\n placeholders: string[]\n /** Email only: the draft on screen goes with the test, saved or not. */\n template?: { subject: string; body: string }\n}) {\n const isEmail = channel === 'email'\n const [recipient, setRecipient] = React.useState('')\n const [sending, setSending] = React.useState(false)\n const valid = isEmail\n ? /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(recipient.trim())\n : recipient.replace(/\\D/g, '').length >= 10\n\n const send = async () => {\n setSending(true)\n try {\n const variables = Object.fromEntries(placeholders.map((p) => {\n const key = p.replace(/[{}]/g, '').trim()\n return [key, SAMPLE[key] ?? key]\n }))\n const result = await sendTestMessage({ eventKey, channel, to: recipient.trim(), variables, template })\n if (result.ok) {\n toast.success(isEmail\n ? 'Teste enviado — confira a caixa de entrada desse e-mail'\n : 'Teste enviado — confira o WhatsApp desse número')\n } else {\n toast.error(TEST_ERROR[result.error ?? ''] ?? result.message ?? 'Não foi possível enviar o teste')\n }\n } finally {\n setSending(false)\n }\n }\n\n return (\n // Sem moldura própria: o strip vive dentro do Card da aba Testar, e uma\n // borda aqui era o anel duplicado de sempre.\n <div className=\"mt-3 flex flex-wrap items-end gap-2\">\n <div className=\"min-w-0 flex-1\">\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">\n {isEmail ? 'E-mail que recebe o teste' : 'Número que recebe o teste'}\n </label>\n {isEmail ? (\n <input\n type=\"email\"\n value={recipient}\n onChange={(e) => setRecipient(e.target.value)}\n placeholder=\"voce@exemplo.com\"\n disabled={sending}\n aria-label=\"E-mail que recebe o teste\"\n className=\"w-full rounded-input border border-input bg-card px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n ) : (\n <PhoneField\n value={recipient}\n onChange={setRecipient}\n placeholder=\"(21) 99999-9999\"\n disabled={sending}\n aria-label=\"Número que recebe o teste\"\n />\n )}\n </div>\n <Button variant=\"outline\" onClick={() => void send()} disabled={!valid || sending}>\n <Send className=\"mr-2 h-3.5 w-3.5\" />\n {sending ? 'Enviando…' : 'Enviar teste'}\n </Button>\n </div>\n )\n}\n\nconst TABS: { value: ViewTab; label: string }[] = [\n { value: 'preview', label: 'Prévia' },\n { value: 'code', label: 'Código' },\n // O que já aconteceu. Fica ao lado do texto, e não numa tela à parte, porque\n // é a mesma pergunta em dois tempos: o que vai sair, e o que saiu.\n { value: 'runs', label: 'Execuções' },\n]\n\n// Só aparece nos canais que têm envio de teste (WhatsApp, e-mail).\nconst TEST_TAB: { value: ViewTab; label: string } = { value: 'test', label: 'Testar' }\n\nconst CHANNEL_LABEL: Record<MessageChannel, string> = {\n email: 'E-mail', whatsapp: 'WhatsApp', sms: 'SMS', push: 'Push', webchat: 'Chat',\n}\n\n// The channel is what distinguishes this screen from its siblings (the same\n// event exists per channel), so the identity slot carries the CHANNEL's face —\n// and WhatsApp's face is its mark, not a generic bubble.\nconst CHANNEL_ICON: Record<MessageChannel, React.ComponentType<{ className?: string }>> = {\n email: Mail, whatsapp: WhatsAppIcon, sms: Smartphone, push: MessageSquare, webchat: MessageSquare,\n}\n\n/** Dados de exemplo da prévia. Não são de ninguém — a tela diz isso. */\n// ---------------------------------------------------------------------------\n// A mensagem, escrita pelo assistente.\n//\n// Client-plane e `mode: 'read'` de propósito: a ferramenta NÃO grava nada — ela\n// preenche o rascunho do editor ao lado, e o Salvar continua sendo um clique de\n// uma pessoa. Declarar `persist` aqui pediria uma confirmação para escrever num\n// campo de texto, e avisaria as listas do app de uma mudança que não houve.\n// ---------------------------------------------------------------------------\nconst WRITE_MESSAGE_TOOL: PluginAITool = {\n id: 'automations.writeMessage',\n name: 'writeAutomationMessage',\n description:\n 'Writes the subject and body of the automation message the user has open, into the editor (it does NOT save — the user does). '\n + 'Use ONLY the placeholders listed in the surface state, spelled exactly, including the braces: an invented one renders as literal text in a message a customer reads. '\n + 'Match the channel: e-mail takes a subject and paragraphs; WhatsApp and SMS take no subject and few lines.',\n icon: 'MessageSquare',\n mode: 'read',\n execution: { plane: 'client' },\n category: 'Automations',\n parameters: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: 'Subject line. Leave empty for channels that have none.' },\n body: { type: 'string', description: 'Message body, with placeholders where they belong.' },\n },\n required: ['body'],\n },\n}\n\nconst SAMPLE: Record<string, string> = {\n store_name: 'Sua Loja', company_name: 'Sua Empresa',\n customer_name: 'Maria Silva', contact_name: 'Maria Silva', lead_name: 'Maria Silva',\n order_number: '1042', order_total: 'R$ 189,90',\n order_items: '1 × Camiseta Clássica — R$ 89,90\\n2 × Caneca Esmaltada — R$ 100,00',\n tracking_code: 'BR123456789BR', cart_url: 'https://sualoja.com.br/carrinho',\n deal_name: 'Proposta — Reforma da fachada', deal_value: 'R$ 12.400,00',\n stage_name: 'Negociação', owner_name: 'João Pereira',\n appointment_date: '12/08/2026', appointment_time: '14:30',\n}\n\nexport interface AutomationDetailPageProps {\n eventKey?: string\n channel?: string\n store: MessageTemplateStore\n /** Para onde o \"voltar\" leva — a lista pode morar no menu ou nas\n * configurações, e a pessoa tem que voltar por onde entrou. */\n backTo?: string\n /**\n * Montada na coluna da direita, ao lado da lista, em vez de ser a tela.\n *\n * Some o cabeçalho próprio: quem nomeia a coluna e oferece a volta é o\n * cabeçalho dela, e desenhar o nosso ali embaixo era o mesmo título duas\n * vezes, com dois jeitos de sair.\n */\n embedded?: boolean\n /**\n * Como sair, quando sair NÃO é navegar.\n *\n * Aberta pela coluna a partir de outra tela (o raio do CRM), a saída é fechar\n * a coluna e continuar onde se estava — `backTo` levaria embora justamente a\n * tela que se queria manter.\n */\n onDone?: () => void\n}\n\nexport function AutomationDetailPage({ eventKey, channel, store, backTo = '/automations', embedded, onDone }: AutomationDetailPageProps) {\n const tenantId = useOrganizationStoreLike()\n const runtime = usePluginRuntimeOptional()\n const fayzConnection = React.useMemo(() => resolveFayzAgentConnection(), [])\n const [message, setMessage] = React.useState<ResolvedMessage | null | undefined>(undefined)\n const [tab, setTab] = React.useState<ViewTab>('preview')\n const [device, setDevice] = React.useState<'desktop' | 'mobile'>('desktop')\n const [draft, setDraft] = React.useState<{ subject: string; body: string } | null>(null)\n // O texto de cada botão enquanto se digita. Grava no blur, não por tecla:\n // cada gravação vai direto ao banco (como o interruptor ao lado), e um PATCH\n // por caractere seria uma automação salva vinte vezes por palavra.\n const [labelDrafts, setLabelDrafts] = React.useState<Record<string, string>>({})\n const [saving, setSaving] = React.useState(false)\n const providerTemplates = useProviderTemplates()\n const { readiness, loading: readinessLoading } = usePaymentReadiness()\n\n const back = React.useCallback(\n () => (onDone ? onDone() : adminNavigateTo(backTo)),\n [onDone, backTo],\n )\n\n // --- assistant surface ---------------------------------------------------\n const surfaceRef = React.useRef({ message, draft })\n surfaceRef.current = { message, draft }\n\n const agentSurface = React.useMemo<AgentSurfaceContribution>(() => ({\n id: 'automations.message',\n pluginId: 'automations',\n instructions:\n 'The user is editing one automation message. `placeholders` in the surface state are the ONLY variables that resolve — copy them verbatim, braces included. '\n + 'Call writeAutomationMessage once with the whole text; the editor fills and the user reviews before saving.',\n describe: () => {\n const o = surfaceRef.current\n if (!o.message) return { title: 'Automação' }\n const current = o.draft ?? { subject: o.message.subject, body: o.message.body }\n return {\n title: `Automação — ${o.message.event?.title ?? o.message.event?.name ?? ''}`,\n state: {\n event: o.message.event?.name ?? null,\n channel: o.message.channel,\n hasSubject: o.message.channel === 'email',\n placeholders: Object.keys(SAMPLE).map((key) => `{{${key}}}`),\n currentSubject: current.subject,\n currentBody: current.body,\n },\n }\n },\n tools: [{\n tool: WRITE_MESSAGE_TOOL,\n execute: (args: Record<string, unknown>) => {\n const o = surfaceRef.current\n if (!o.message) return { ok: false, error: 'no_message_open' }\n const current = o.draft ?? { subject: o.message.subject, body: o.message.body }\n const body = String(args.body ?? '').trim()\n if (!body) return { ok: false, error: 'empty_body' }\n const subject = args.subject === undefined ? current.subject : String(args.subject)\n setDraft({ subject, body })\n // Leva para a aba do texto: ele acabou de mudar e a pré-visualização\n // não mostra onde mexer.\n setTab('code')\n return { ok: true, filled: true, saved: false, note: 'Draft filled — the user still has to press Save.' }\n },\n }],\n }), [])\n useAgentSurface(agentSurface)\n\n const reload = React.useCallback(async () => {\n if (!eventKey || !channel) { setMessage(null); return }\n let overrides: Awaited<ReturnType<MessageTemplateStore['list']>> = []\n try {\n overrides = await store.list(tenantId)\n } catch (err) {\n console.warn('[automations] could not load overrides; showing defaults', err)\n }\n const found = resolveMessage(decodeURIComponent(eventKey), channel as MessageChannel, overrides, runtime?.events ?? [])\n setMessage(found)\n if (found) setDraft({ subject: found.subject, body: found.body })\n }, [eventKey, channel, store, tenantId, runtime])\n\n React.useEffect(() => { void reload() }, [reload])\n\n const header = embedded ? null : (\n <SubpageHeader\n title={message === undefined ? '' : (message?.override?.name ?? message?.event.title ?? message?.event.name ?? 'Automação')}\n parentLabel=\"Automações\"\n onBack={back}\n />\n )\n\n if (message === undefined) {\n return (\n <div className=\"space-y-4\">\n {header}\n <div className=\"h-8 w-64 animate-pulse rounded bg-muted\" />\n <Card className=\"h-96 animate-pulse\" />\n </div>\n )\n }\n\n if (!message) {\n return (\n <>\n {header}\n <Card className=\"flex flex-col items-center gap-2 p-12 text-center\">\n <Mail className=\"h-9 w-9 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"font-semibold\">Automação não encontrada</p>\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n O evento <code className=\"font-mono\">{eventKey}</code> não está no catálogo — o módulo\n que o registra pode não estar instalado nesta conta.\n </p>\n <Button variant=\"outline\" className=\"mt-2\" onClick={back}>Voltar para Automações</Button>\n </Card>\n </>\n )\n }\n\n const event = message.event\n // O texto de fábrica: o que \"restaurar padrão\" devolve. Vem do registro de\n // padrões, não do evento — o evento é o fato, não a mensagem.\n const fallback = { subject: message.override ? undefined : message.subject, body: message.body }\n const ChannelIcon = CHANNEL_ICON[message.channel] ?? Zap\n const isWhatsapp = message.channel === 'whatsapp'\n const current = draft ?? { subject: message.subject, body: message.body }\n const dirty = current.subject !== message.subject || current.body !== message.body\n const hasSubject = message.channel === 'email'\n\n const patch = async (input: Parameters<MessageTemplateStore['upsert']>[0]) => {\n setSaving(true)\n try {\n await store.upsert(input, tenantId)\n await reload()\n } catch (err) {\n console.warn('[automations] save failed', err)\n toast.error('Não foi possível salvar')\n } finally {\n setSaving(false)\n }\n }\n\n const save = () => void patch({\n eventKey: event.name,\n channel: message.channel,\n // Igual ao padrão volta a ser \"sem personalização\", não uma cópia.\n subject: current.subject.trim() === (fallback?.subject ?? '') ? null : current.subject.trim() || null,\n body: current.body.trim() === fallback?.body ? null : current.body.trim() || null,\n })\n\n const reset = async () => {\n setDraft({ subject: fallback?.subject ?? '', body: fallback?.body ?? '' })\n setSaving(true)\n try {\n // Apaga a linha inteira: com ela fora, o padrão volta a valer e melhorias\n // no texto de fábrica voltam a chegar aqui.\n await store.reset(event.name, message.channel, tenantId)\n await reload()\n toast.success('Texto restaurado')\n } catch (err) {\n console.warn('[automations] reset failed', err)\n toast.error('Não foi possível restaurar')\n } finally {\n setSaving(false)\n }\n }\n\n const previewSubject = renderMessageTemplate(current.subject, SAMPLE)\n const previewBody = renderMessageTemplate(current.body, SAMPLE)\n\n return (\n <div className=\"space-y-5\">\n {header}\n\n {/* Identidade e controles.\n Numa página larga cabem na mesma linha. Na coluna não cabem: as\n pastilhas quebravam uma por linha, a descrição virava uma coluna de\n três palavras e \"Restaurar padrão\" por extenso empurrava o Salvar para\n fora — por isso na coluna eles são duas faixas empilhadas, com o\n restaurar reduzido ao seu glifo. */}\n <div className={embedded ? 'space-y-3' : 'flex flex-wrap items-start gap-3'}>\n <div className={embedded ? 'flex items-start gap-3' : 'contents'}>\n <span\n className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border ${\n isWhatsapp\n ? 'border-[#25D366]/30 bg-[#25D366]/10 text-[#1faf55]'\n : 'border-border text-muted-foreground'\n }`}\n >\n <ChannelIcon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant=\"outline\">{CHANNEL_LABEL[message.channel]}</Badge>\n <Badge variant=\"outline\">{message.kind === 'marketing' ? 'Marketing' : 'Transacional'}</Badge>\n {message.customized && <Badge variant=\"info\">Personalizado</Badge>}\n </div>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{event.description}</p>\n {/* Aqui a pastilha aparece MESMO quando está tudo certo, e traz o\n motivo junto: é a tela onde se decide o que fazer com uma\n recusa, e \"recusado\" sem o motivo não deixa ninguém agir. */}\n <div className=\"mt-1.5\">\n <ProviderTemplateBadge\n approval={providerApprovalFor(providerTemplates, event.name, message.channel)}\n showDetail\n />\n </div>\n </div>\n </div>\n\n <div className={embedded ? 'flex items-center gap-2' : 'flex shrink-0 flex-wrap items-center gap-2'}>\n {/* O mesmo interruptor da lista: liga na hora, sem passar pelo Salvar\n — que aqui é só do TEXTO. Vem primeiro na coluna porque é o que se\n toca com mais frequência, e porque ligar não é salvar. */}\n <Switch\n size=\"md\"\n checked={message.enabled}\n onCheckedChange={(next) => void patch({ eventKey: event.name, channel: message.channel, enabled: next })}\n disabled={saving}\n label={message.enabled ? 'Ativa' : 'Inativa'}\n />\n <div className={embedded ? 'ml-auto flex items-center gap-2' : 'contents'}>\n <Hint label=\"Descarta o texto personalizado e volta ao padrão do produto.\">\n <span>\n <Button\n variant={embedded ? 'ghost' : 'outline'}\n size={embedded ? 'icon' : undefined}\n onClick={() => void reset()}\n disabled={!message.customized || saving}\n aria-label={embedded ? 'Restaurar padrão' : undefined}\n >\n <RotateCcw className={embedded ? 'h-4 w-4' : 'mr-2 h-4 w-4'} />\n {!embedded && 'Restaurar padrão'}\n </Button>\n </span>\n </Hint>\n {/* Escrever a mensagem É o trabalho desta tela, e é o trabalho que\n um modelo faz melhor que um campo vazio. A ferramenta preenche o\n RASCUNHO — quem salva continua sendo a pessoa, no botão ao lado. */}\n <AskAIButton\n variant={embedded ? 'ghost' : 'outline'}\n label={embedded ? '' : undefined}\n hint=\"Descreva o tom da mensagem…\"\n intro={{\n role: 'setup',\n persona: 'Redator das automações',\n pitch: 'Diga como esta mensagem deve soar.',\n description:\n 'Escrevo o assunto e o corpo desta automação usando as variáveis que ela tem à disposição. O texto cai no editor ao lado para você revisar — nada é salvo sem você.',\n suggestions: [\n { label: 'Mais curta e direta' },\n { label: 'Mais calorosa, com o nome do cliente' },\n { label: 'Formal, para um público corporativo' },\n ],\n }}\n />\n {/* Uma tela, um CTA: o Salvar só se veste de botão primário quando\n há o que salvar. \"Salvo\" não é uma ação — desenhá-lo como um\n botão apagado deixava um CTA morto no lugar mais nobre da\n coluna; como confirmação silenciosa, ele diz o estado e sai do\n caminho. */}\n {dirty || saving ? (\n <Button onClick={save} disabled={saving}>\n {saving ? 'Salvando…' : 'Salvar'}\n </Button>\n ) : (\n <span className=\"inline-flex h-9 items-center gap-1 px-2 text-xs font-medium text-muted-foreground\">\n <Check className=\"h-3.5 w-3.5\" />\n Salvo\n </span>\n )}\n </div>\n </div>\n </div>\n\n <HeaderTabs\n tabs={isWhatsapp || message.channel === 'email' ? [...TABS, TEST_TAB] : TABS}\n value={tab}\n onChange={setTab}\n aria-label=\"Visualização\"\n />\n\n <div className=\"flex flex-wrap items-center gap-x-6 gap-y-2 border-b border-border pb-4 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Zap className=\"h-3.5 w-3.5\" />\n Gatilho:\n <code className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-foreground\">{event.name}</code>\n </span>\n <span className=\"inline-flex items-center gap-1.5\">\n <Clock className=\"h-3.5 w-3.5\" />\n {event.trigger}\n </span>\n {hasSubject && current.subject && <span className=\"min-w-0 truncate\">Assunto: {current.subject}</span>}\n </div>\n\n {tab === 'runs' ? (\n // Atrás de um projeto Fayz o histórico verdadeiro é o da plataforma —\n // é ela quem executa. Fora dele, o coletor local continua valendo.\n fayzConnection ? (\n <FayzRunLog connection={fayzConnection} eventKey={event.name} tenantId={tenantId} enabled={message.enabled} />\n ) : (\n <RunLog eventKey={event.name} tenantId={tenantId} enabled={message.enabled} />\n )\n ) : tab === 'preview' ? (\n <Card className=\"overflow-hidden\">\n {/* Na coluna, a aba ativa já diz \"Prévia\" logo acima — repetir o\n título dentro do cartão era o mesmo nome duas vezes a um dedo de\n distância. A faixa só existe na página larga, onde carrega a\n comparação computador/celular. */}\n {!embedded && (\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-4 py-2.5\">\n <span className=\"text-sm font-medium\">Prévia</span>\n {/* Computador/celular é uma COMPARAÇÃO de larguras, e a coluna tem\n uma só: os dois botões levavam ao mesmo desenho, e um controle\n que não muda nada é pior do que controle nenhum. */}\n <div className=\"flex items-center gap-1\">\n {(['desktop', 'mobile'] as const).map((d) => (\n <button\n key={d}\n type=\"button\"\n onClick={() => setDevice(d)}\n aria-label={d === 'desktop' ? 'Computador' : 'Celular'}\n className={`flex h-7 w-7 items-center justify-center rounded-md transition-colors ${\n device === d ? 'bg-muted text-foreground' : 'text-muted-foreground hover:bg-muted/60'\n }`}\n >\n {d === 'desktop' ? <Monitor className=\"h-4 w-4\" /> : <Smartphone className=\"h-4 w-4\" />}\n </button>\n ))}\n </div>\n </div>\n )}\n\n <div className={embedded ? 'bg-muted/30 p-4' : 'bg-muted/30 p-6'}>\n {/* WhatsApp/SMS não têm assunto nem cabeçalho de remetente — mostrar\n a moldura de e-mail neles prometeria uma forma que o canal não\n tem. */}\n {/* Uma aresta só: a moldura interna vive de sombra e cantos\n clipados — borda aqui somava um segundo anel dentro do Card. */}\n <div\n className={`mx-auto overflow-hidden rounded-card bg-card shadow-sm transition-[max-width] ${\n device === 'mobile' ? 'max-w-[380px]' : hasSubject ? 'max-w-[600px]' : 'max-w-[420px]'\n }`}\n >\n {hasSubject ? (\n <>\n {/* Moldura de navegador (Safari): a prévia de e-mail é \"como\n o cliente vê no Gmail\", e a janela diz isso sem legenda.\n Semáforo decorativo — nada aqui é clicável. */}\n <div aria-hidden className=\"flex items-center gap-1.5 border-b border-border bg-muted/40 px-4 py-2.5\">\n <span className=\"h-3 w-3 rounded-full bg-[#ff5f57]\" />\n <span className=\"h-3 w-3 rounded-full bg-[#febc2e]\" />\n <span className=\"h-3 w-3 rounded-full bg-[#28c840]\" />\n </div>\n <div className=\"px-6 pb-4 pt-5\">\n <p className=\"text-base font-semibold leading-snug\">{previewSubject}</p>\n {/* A linha do remetente, como no Gmail: avatar + nome no\n topo-esquerdo, destinatário embaixo, hora à direita. */}\n <div className=\"mt-4 flex items-center gap-3\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary\">\n {(SAMPLE.store_name ?? 'S').charAt(0)}\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold\">{SAMPLE.store_name}</p>\n <p className=\"text-xs text-muted-foreground\">para mim</p>\n </div>\n <span className=\"ml-auto shrink-0 text-xs text-muted-foreground\">09:41</span>\n </div>\n </div>\n <div className=\"whitespace-pre-wrap border-t border-border px-6 py-5 text-sm leading-relaxed\">{previewBody}</div>\n </>\n ) : (\n <div\n className=\"p-4\"\n // O papel de parede real do WhatsApp: quem escreve vê a\n // mensagem no palco em que ela vai aparecer. O balão é\n // sempre o de saída (verde) — é o negócio falando. Sem\n // raio próprio: a moldura clipa os cantos.\n style={isWhatsapp ? { backgroundImage: `url(${WHATSAPP_PREVIEW_BG})`, backgroundSize: 'cover', backgroundPosition: 'center' } : undefined}\n >\n <div className=\"whitespace-pre-wrap rounded-2xl rounded-tl-sm bg-[#dcf8c6] px-3 py-2 text-sm leading-relaxed text-[#111b21] shadow-sm\">\n {previewBody}\n </div>\n {/* Os botões fazem parte da mensagem, então fazem parte da\n prévia: quem escreve o texto precisa ver que Confirmar e\n Cancelar já dizem o que a última linha ia dizer. */}\n {message.actions.length > 0 && (\n <div className=\"mt-1 space-y-1\">\n {message.actions.map((action) => (\n <div\n key={action.id}\n // Chips brancos, como o WhatsApp desenha reply buttons —\n // no papel de parede o verde do balão os engolia.\n className=\"rounded-lg bg-white px-3 py-1.5 text-center text-sm font-medium text-[#1e7fd6] shadow-sm\"\n >\n {action.label}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n <p className=\"mt-4 text-center text-xs text-muted-foreground\">\n Dados de exemplo — nenhum registro real foi usado.\n </p>\n </div>\n </Card>\n ) : tab === 'test' ? (\n <Card className=\"p-4\">\n <p className=\"text-sm text-muted-foreground\">\n {isWhatsapp\n ? 'Envio real, pelo mesmo caminho da automação — modelo aprovado, número ativo e entrega de verdade, com os dados de exemplo.'\n : 'Envio real, pelo mesmo caminho da automação — vai o texto que está na tela, salvo ou não, com os dados de exemplo.'}\n </p>\n <TestSendStrip\n eventKey={event.name}\n channel={message.channel}\n placeholders={message.placeholders}\n // WhatsApp must ride the Meta-approved template; email tests\n // exactly the text on screen, saved or not.\n template={message.channel === 'email'\n ? { subject: current.subject, body: current.body }\n : undefined}\n />\n </Card>\n ) : (\n <Card className=\"space-y-4 p-4\">\n {hasSubject && (\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">Assunto</label>\n <input\n value={current.subject}\n onChange={(e) => setDraft({ ...current, subject: e.target.value })}\n className=\"w-full rounded-input border border-input bg-card px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n <div>\n <label className=\"mb-1 block text-xs font-medium text-muted-foreground\">Mensagem</label>\n <textarea\n rows={14}\n value={current.body}\n onChange={(e) => setDraft({ ...current, body: e.target.value })}\n className=\"w-full rounded-input border border-input bg-card px-3 py-2 font-mono text-xs leading-relaxed focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n {message.channel === 'whatsapp' && (\n <div>\n <p className=\"mb-1.5 text-xs font-medium text-muted-foreground\">\n Botões — o cliente responde no toque, sem digitar\n </p>\n <div className=\"space-y-2\">\n {ACTION_CATALOG.map((action) => {\n const active = message.actions.find((a) => a.id === action.id)\n const on = Boolean(active)\n // `pay` é o único que pergunta a alguém de fora se pode.\n const gated = action.id === 'pay' && !canOfferPayment(readiness)\n const blocked = gated && !readinessLoading\n const labelValue = labelDrafts[action.id] ?? active?.label ?? action.label\n const commitLabel = () => {\n const next = labelValue.trim()\n setLabelDrafts((d) => { const { [action.id]: _, ...rest } = d; return rest })\n if (!active || !next || next === active.label) return\n void patch({\n eventKey: event.name,\n channel: message.channel,\n actions: message.actions.map((a) => (a.id === action.id ? { ...a, label: next } : a)),\n })\n }\n return (\n <div key={action.id} className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n <Switch\n size=\"md\"\n checked={on}\n disabled={saving || gated}\n onCheckedChange={(next) => void patch({\n eventKey: event.name,\n channel: message.channel,\n actions: nextActions(message.actions, action.id, next),\n })}\n label={on ? '' : action.label}\n />\n {on && (\n // O texto do botão como a cliente vê. 25 caracteres é o\n // teto da Meta para QUICK_REPLY; mudar o texto de um\n // modelo já aprovado dispara nova aprovação — a\n // pastilha de status acima conta essa história.\n <input\n value={labelValue}\n maxLength={25}\n disabled={saving}\n aria-label={`Texto do botão ${action.label}`}\n onChange={(e) => setLabelDrafts((d) => ({ ...d, [action.id]: e.target.value }))}\n onBlur={commitLabel}\n onKeyDown={(e) => { if (e.key === 'Enter') (e.target as HTMLInputElement).blur() }}\n className=\"w-36 rounded-input border border-input bg-card px-2 py-1 text-sm focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n )}\n <p className=\"text-xs text-muted-foreground\">\n {blocked\n ? 'Para cobrar por aqui, configure a conta de pagamento em Conversas → Tyxter.'\n : action.hint}\n </p>\n </div>\n )\n })}\n </div>\n </div>\n )}\n <div>\n <p className=\"mb-1.5 text-xs font-medium text-muted-foreground\">\n Campos deste evento — o envio substitui pelo dado real\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {message.placeholders.map((p) => (\n <span key={p} className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground\">\n {p}\n </span>\n ))}\n </div>\n </div>\n </Card>\n )}\n </div>\n )\n}\n","import type { UnifiedConnector } from '@fayz-ai/admin'\nimport type { ConnectorDelivery } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// As automações que a INTEGRAÇÃO é dona.\n//\n// A tela de automações lia uma fonte só: mensagens. \"Quando um horário é\n// agendado → manda um e-mail\" é uma preferência que alguém escolheu, mora numa\n// linha de `plg_automations_templates` e pode ser apagada. \"Quando um horário é\n// agendado → cria o evento no Google Calendar\" não é preferência nenhuma: é o\n// que a integração É. Por isso é uma SEGUNDA fonte de linhas, e não um texto\n// padrão fingido — um texto padrão viraria uma linha que o usuário pode apagar,\n// deixando a integração conectada e meio ligada em silêncio.\n//\n// Elas existem só enquanto a conexão está viva. Desconectar é a saída, e é a\n// única — o contrato está em ConnectorManagedAutomation (@fayz-ai/core).\n// ---------------------------------------------------------------------------\n\nexport interface ConnectorAutomationRow {\n connectorId: string\n connectorName: string\n /** Onde a integração é configurada — para onde a linha leva. */\n hostPluginId?: string\n /** A cara da integração, resolvida como em qualquer outra tela (ConnectorMark). */\n icon?: string\n logoUrl?: string\n eventKey: string\n label: string\n /** O locatário pode desligar esta e seguir conectado. */\n optional: boolean\n /** Registro a registro: o que chegou no provedor. Ausente = a integração não conta. */\n listDeliveries?: (options?: { eventKey?: string; limit?: number }) => Promise<ConnectorDelivery[]>\n}\n\n/** As linhas de automação dos conectores CONECTADOS. Nada dos demais. */\nexport function connectorAutomationRows(connectors: UnifiedConnector[]): ConnectorAutomationRow[] {\n const out: ConnectorAutomationRow[] = []\n for (const connector of connectors) {\n if (connector.state !== 'connected') continue\n for (const auto of connector.definition?.managedAutomations ?? []) {\n out.push({\n connectorId: connector.id,\n connectorName: connector.name,\n hostPluginId: connector.hostPluginId,\n icon: connector.icon,\n logoUrl: connector.logoUrl,\n eventKey: auto.eventKey,\n label: auto.label,\n optional: auto.optional ?? false,\n ...(connector.definition?.listDeliveries\n ? { listDeliveries: connector.definition.listDeliveries.bind(connector.definition) }\n : {}),\n })\n }\n }\n return out\n}\n\n/** Agrupadas por conector: o dono precisa estar escrito em cima das linhas. */\nexport function groupConnectorAutomations(\n rows: ConnectorAutomationRow[],\n): {\n connectorId: string\n connectorName: string\n hostPluginId?: string\n icon?: string\n logoUrl?: string\n items: ConnectorAutomationRow[]\n}[] {\n const groups: ReturnType<typeof groupConnectorAutomations> = []\n for (const row of rows) {\n let group = groups.find((g) => g.connectorId === row.connectorId)\n if (!group) {\n group = {\n connectorId: row.connectorId,\n connectorName: row.connectorName,\n hostPluginId: row.hostPluginId,\n icon: row.icon,\n logoUrl: row.logoUrl,\n items: [],\n }\n groups.push(group)\n }\n group.items.push(row)\n }\n return groups\n}\n","import React from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { Card } from '@fayz-ai/ui'\nimport { adminNavigateTo, connectorRoute, ConnectorDeliveries, ConnectorMark } from '@fayz-ai/admin'\nimport {\n groupConnectorAutomations,\n type ConnectorAutomationRow,\n} from '../lib/connector-automations'\n\n// ---------------------------------------------------------------------------\n// As linhas que a integração é dona.\n//\n// Sem interruptor e sem lixeira, de propósito: uma linha apagada deixaria a\n// integração conectada e meio ligada, e semanas depois isso chega como \"o\n// Google Calendar parou de funcionar\". A saída é desconectar, e a linha diz\n// isso em texto — não em botão cinza, que se lê como algo que o usuário poderia\n// consertar (mesmo padrão de ConnectorDetail → \"faz parte do app\").\n// ---------------------------------------------------------------------------\n\nexport function ConnectorAutomations({ rows }: { rows: ConnectorAutomationRow[] }) {\n if (rows.length === 0) return null\n\n return (\n <>\n {groupConnectorAutomations(rows).map((group) => {\n const href = connectorRoute({ hostPluginId: group.hostPluginId })\n return (\n <div key={group.connectorId} className=\"space-y-3\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.connectorName}\n </p>\n {group.items.map((row) => (\n <AutomationCard\n key={`${group.connectorId}:${row.eventKey}`}\n row={row}\n group={group}\n href={href}\n />\n ))}\n </div>\n )\n })}\n </>\n )\n}\n\n/**\n * Uma linha da integração, e — quando a integração sabe responder — o que de\n * fato chegou lá.\n *\n * A tela dizia que o gatilho existe. Não dizia se o pedido subiu, que é a\n * pergunta que alguém tem depois de cadastrar. As duas metades eram contadas por\n * sistemas diferentes e nenhum conhecia o outro.\n */\nfunction AutomationCard({\n row,\n group,\n href,\n}: {\n row: ConnectorAutomationRow\n group: { connectorId: string; connectorName: string; icon?: string; logoUrl?: string }\n href: string\n}) {\n const [open, setOpen] = React.useState(false)\n\n return (\n <Card className=\"overflow-hidden\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => adminNavigateTo(href)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); adminNavigateTo(href) }\n }}\n className=\"flex cursor-pointer items-start gap-4 p-4 transition-colors hover:bg-muted/30 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {/* A mesma cara que a integração tem em qualquer outra tela: um plugue\n cinza aqui e o logo do Bling na tela de conectores é a mesma coisa\n parecendo duas. */}\n <ConnectorMark\n connector={{\n id: group.connectorId,\n name: group.connectorName,\n icon: group.icon,\n logoUrl: group.logoUrl,\n }}\n size=\"sm\"\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium\">{row.label}</p>\n <p className=\"text-sm text-muted-foreground\">\n Quando <code className=\"font-mono text-xs\">{row.eventKey}</code> acontece aqui.\n </p>\n </div>\n <span className=\"shrink-0 pt-0.5 text-right text-xs text-muted-foreground\">\n {row.optional\n ? `Opcional — desligue em ${group.connectorName}`\n : `Ligada pela integração · sai ao desconectar ${group.connectorName}`}\n </span>\n </div>\n\n {row.listDeliveries && (\n <>\n <button\n type=\"button\"\n onClick={() => setOpen(!open)}\n aria-expanded={open}\n className=\"flex w-full items-center gap-2 border-t border-border px-4 py-2 text-left transition-colors hover:bg-muted/40\"\n >\n <ChevronRight className={`h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform ${open ? 'rotate-90' : ''}`} />\n <span className=\"text-xs font-medium\">O que já foi para o {group.connectorName}</span>\n </button>\n {open && (\n <div className=\"border-t border-border p-4\">\n <ConnectorDeliveries\n load={(options) => row.listDeliveries!({ ...options, eventKey: row.eventKey })}\n providerName={group.connectorName}\n />\n </div>\n )}\n </>\n )}\n </Card>\n )\n}\n","import { errorMessage } from '@fayz-ai/core'\nimport React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport { ChevronRight, Mail, Megaphone, MessageSquare, Receipt, Smartphone, WandSparkles, Zap } from 'lucide-react'\nimport { Card, PageHeaderActions, PageTabs, Switch, toast, WhatsAppIcon } from '@fayz-ai/ui'\nimport {\n adminNavigateTo, useConnectors, askAI, PageActions, RightRailPage, SettingsTabs, useAgentSurface,\n type AgentSurfaceContribution,\n} from '@fayz-ai/admin'\nimport type { PluginAITool } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// A lista inteira, entregue ao assistente.\n//\n// Da lista dá para fazer as duas coisas que se faz aqui — ligar/desligar e\n// escrever o texto — sem abrir uma por uma, que é a diferença entre \"revise as\n// mensagens de pedido\" e catorze cliques. Passa pelo MESMO `store.upsert` do\n// interruptor e do botão Salvar.\n//\n// `persist` de propósito, ao contrário da ferramenta da tela de detalhe: aqui o\n// texto vai direto para o registro, sem passar por um editor onde alguém leia\n// antes. A confirmação obrigatória é o que põe uma pessoa entre o modelo e uma\n// mensagem que um cliente vai receber.\n// ---------------------------------------------------------------------------\nconst CONFIGURE_TOOL: PluginAITool = {\n id: 'automations.configure',\n name: 'configureAutomation',\n description:\n 'Turns an automation on or off, and/or rewrites its message. Use the `event` and `channel` values exactly as they appear in the surface state. '\n + 'Placeholders must come from that automation\\'s own list — an invented one renders as literal text in a message a customer reads. '\n + 'To review several, call once per automation.',\n icon: 'Zap',\n mode: 'persist',\n execution: { plane: 'client' },\n category: 'Automations',\n parameters: {\n type: 'object',\n properties: {\n event: { type: 'string', description: 'Event key from the surface state.' },\n channel: { type: 'string', description: 'Channel of that automation (email | whatsapp | sms | in_app).' },\n enabled: { type: 'boolean', description: 'Turn it on or off. Omit to leave as is.' },\n subject: { type: 'string', description: 'New subject. Email only.' },\n body: { type: 'string', description: 'New message body.' },\n },\n required: ['event', 'channel'],\n },\n}\nimport { AutomationDetailPage } from './AutomationDetailPage'\nimport { resolveMessages, useOrganizationStoreLike } from '../lib/runtime'\nimport { usePluginRuntimeOptional } from '@fayz-ai/core'\nimport type { MessageChannel, MessageKind, ResolvedMessage } from '@fayz-ai/core'\nimport type { MessageTemplateStore } from '../data/templates'\nimport { connectorAutomationRows } from '../lib/connector-automations'\nimport { ConnectorAutomations } from './ConnectorAutomations'\nimport {\n ProviderTemplateBadge, providerApprovalFor, useProviderTemplates,\n} from './ProviderTemplateStatus'\n\n// ---------------------------------------------------------------------------\n// Automações — quando ISTO acontece, mande AQUILO.\n//\n// Cada linha é uma automação inteira: o gatilho à esquerda, o canal na\n// pastilha, o interruptor à direita. Não existe \"modelo\" separado do \"fluxo\" —\n// um texto sem gatilho nunca sai, e um fluxo de um passo é o texto com o\n// gatilho escrito na frente.\n//\n// Agrupado por MÓDULO (Loja, CRM, Agenda) e não por canal, porque é assim que a\n// pergunta chega: \"o que a gente manda quando um pedido é enviado?\" — e a\n// resposta pode ser um e-mail, um WhatsApp, ou os dois. Separar por canal, como\n// fazia a tela de e-mails, obriga a visitar dois menus para responder isso.\n//\n// Cada linha é um par evento×canal. O evento aparece uma vez, com uma pastilha\n// por canal ofertado: é o desenho que o RD Station e o Kommo usam para não\n// esconder que \"confirmação de pedido\" e \"confirmação por WhatsApp\" são o mesmo\n// gatilho com duas saídas.\n//\n// Duas fontes de linha, e não uma: além das mensagens, as automações que uma\n// integração conectada é dona — ../lib/connector-automations.ts diz por quê.\n// ---------------------------------------------------------------------------\n\n// A porta de IA desta tela, fora do JSX para a ação poder ser declarada.\nconst ASK_AI_ACTION = {\n label: 'Criar com IA',\n hint: 'O que revisar nas automações…',\n intro: {\n role: 'setup' as const,\n persona: 'Redator das automações',\n pitch: 'Diga o que revisar nas automações.',\n description:\n 'Vejo todas as automações deste app, quais estão ligadas e o texto de cada uma. Posso ligar, desligar e reescrever — em uma ou em várias de uma vez. Você confirma cada mudança.',\n suggestions: [\n { label: 'Revise as mensagens de pedido no tom da minha marca' },\n { label: 'Ligue as automações de entrega' },\n { label: 'Deixe as mensagens de WhatsApp mais curtas' },\n ],\n },\n}\n\nconst CHANNEL_ICON: Record<MessageChannel, React.ComponentType<{ className?: string }>> = {\n email: Mail,\n // The brand glyph, not a generic bubble: in a list of channels, WhatsApp\n // is recognized by its mark before its label.\n whatsapp: WhatsAppIcon,\n sms: Smartphone,\n push: MessageSquare,\n webchat: MessageSquare,\n}\n\nconst CHANNEL_LABEL: Record<MessageChannel, string> = {\n email: 'E-mail', whatsapp: 'WhatsApp', sms: 'SMS', push: 'Push', webchat: 'Chat',\n}\n\nconst KIND_TABS: { value: MessageKind | 'all'; label: string; icon: React.ComponentType<{ className?: string }> }[] = [\n { value: 'all', label: 'Todos', icon: Zap },\n { value: 'transactional', label: 'Transacionais', icon: Receipt },\n { value: 'marketing', label: 'Marketing', icon: Megaphone },\n]\n\nconst KIND_HINT: Record<string, string> = {\n all: 'Tudo que o produto sabe enviar, por qualquer canal.',\n transactional: 'Disparados por uma ação da pessoa. Não precisam de opt-in.',\n marketing: 'Iniciativa da empresa. Só para quem aceitou receber.',\n}\n\nfunction iconFor(name?: string): React.ComponentType<{ className?: string }> {\n if (!name) return Zap\n const icons = LucideIcons as unknown as Record<string, React.ComponentType<{ className?: string }>>\n return icons[name] ?? Zap\n}\n\n/**\n * Qual automação a URL está pedindo. `null` = nenhuma, e a coluna fica com o\n * assistente.\n *\n * A URL continua sendo a verdade mesmo com o detalhe na coluna: é o que faz o\n * link direto funcionar e o botão voltar do navegador FECHAR o painel em vez de\n * sair da lista.\n */\nfunction readSelection(basePath: string): { eventKey: string; channel: string } | null {\n const hash = window.location.hash.slice(1) || '/'\n if (!hash.startsWith(basePath + '/')) return null\n const [eventKey, channel] = hash.slice(basePath.length + 1).split('/')\n if (!eventKey || !channel) return null\n return { eventKey, channel }\n}\n\nexport function AutomationsList({ store, variant = 'page', basePath = '/automations' }: {\n store: MessageTemplateStore\n /**\n * Onde esta lista mora, e portanto sob que caminho o detalhe abre.\n *\n * A lista pode estar no menu (`/automations`) ou dentro de Configurações\n * (`/settings/automations`) — e o detalhe tem que abrir SOB ela, senão clicar\n * numa linha dentro de Configurações jogava a pessoa para fora da tela em que\n * ela estava.\n */\n basePath?: string\n /**\n * Onde a lista está montada, e portanto que faixa de abas ela desenha.\n *\n * 'page' a tela é dela: a faixa é a sub-cabeça do módulo, sangra até as\n * bordas e sua régua encontra a barra da shell.\n * 'panel' ela é o conteúdo de uma aba de Configurações, onde a shell já\n * escreveu \"← Configurações / Automações\". Aí vale a MESMA faixa dos\n * outros painéis de configuração (Agenda, CRM, Formulários), que\n * começa e termina onde o conteúdo começa e termina.\n */\n variant?: 'page' | 'panel'\n}) {\n const tenantId = useOrganizationStoreLike()\n // Os eventos vêm do runtime: só os plugins ATIVOS anunciam fatos.\n const runtime = usePluginRuntimeOptional()\n const [messages, setMessages] = React.useState<ResolvedMessage[] | null>(null)\n const [kind, setKind] = React.useState<MessageKind | 'all'>('all')\n // A segunda fonte de linhas: as automações que a integração é dona. Mesmo\n // loader dos conectores — duas leituras seriam duas respostas para \"o Google\n // Calendar está ligado?\". Sem grants e sem catálogo: nada disso vira linha\n // aqui, e assim a tela não faz rede nenhuma.\n const { connectors } = useConnectors({ includeGrants: false, includeCatalog: false })\n const owned = React.useMemo(() => connectorAutomationRows(connectors ?? []), [connectors])\n // O que a Meta respondeu sobre cada modelo de WhatsApp. Uma leitura por tela,\n // e sem ela a lista continua inteira — só sem a pastilha.\n const providerTemplates = useProviderTemplates()\n\n // A automação aberta na coluna da direita, lida da URL.\n const [selected, setSelected] = React.useState(() => readSelection(basePath))\n React.useEffect(() => {\n const sync = () => setSelected(readSelection(basePath))\n sync()\n window.addEventListener('hashchange', sync)\n return () => window.removeEventListener('hashchange', sync)\n }, [basePath])\n\n const reload = React.useCallback(async () => {\n // Uma leitura que falha ainda mostra o catálogo inteiro nos padrões: os\n // eventos são código, então \"sem personalização\" é um estado válido e\n // completo, não uma tela vazia.\n let overrides: Awaited<ReturnType<MessageTemplateStore['list']>> = []\n try {\n overrides = await store.list(tenantId)\n } catch (err) {\n console.warn('[automations] could not load template overrides; showing defaults', err)\n }\n setMessages(resolveMessages(overrides, runtime?.events ?? []))\n }, [store, tenantId, runtime])\n\n React.useEffect(() => { void reload() }, [reload])\n\n // --- assistant surface ---------------------------------------------------\n const surfaceRef = React.useRef({ messages, store, tenantId, reload, basePath })\n surfaceRef.current = { messages, store, tenantId, reload, basePath }\n\n const agentSurface = React.useMemo<AgentSurfaceContribution>(() => ({\n id: 'automations.list',\n pluginId: 'automations',\n instructions:\n 'The user is on the automations list. `automations` in the surface state is the complete set — use each entry\\'s `event` and `channel` verbatim, and each entry\\'s own `placeholders` when rewriting its text. '\n + 'Call configureAutomation once per automation you change; say afterwards which ones you touched.',\n describe: () => {\n const o = surfaceRef.current\n return {\n title: 'Automações',\n state: {\n automations: (o.messages ?? []).map((m) => ({\n event: m.event.name,\n title: m.event.title,\n channel: m.channel,\n enabled: m.enabled,\n customized: Boolean(m.customized),\n subject: m.subject,\n body: m.body,\n // `fields` é o contrato do evento — os mesmos descritores que viram\n // as merge fields do editor. É de lá que saem os placeholders.\n placeholders: (m.event.fields ?? []).map((f) => `{{${f.name}}}`),\n })),\n },\n }\n },\n tools: [{\n tool: CONFIGURE_TOOL,\n execute: async (args: Record<string, unknown>) => {\n const o = surfaceRef.current\n const found = (o.messages ?? []).find(\n (m) => m.event.name === args.event && m.channel === args.channel,\n )\n if (!found) {\n return {\n ok: false,\n error: 'unknown_automation',\n available: (o.messages ?? []).map((m) => `${m.event.name}/${m.channel}`),\n }\n }\n try {\n await o.store.upsert({\n eventKey: found.event.name,\n channel: found.channel,\n ...(args.enabled === undefined ? {} : { enabled: Boolean(args.enabled) }),\n ...(args.subject === undefined ? {} : { subject: String(args.subject) }),\n ...(args.body === undefined ? {} : { body: String(args.body) }),\n }, o.tenantId)\n await o.reload()\n // `ref.path` decorates the reply with a goto chip (RecordChip) — the\n // user lands on what the agent just changed. `path`, not archetype:\n // an automation is a settings destination, not a record.\n return {\n ok: true,\n event: found.event.name,\n channel: found.channel,\n ref: {\n id: `${found.event.name}/${found.channel}`,\n label: `${found.event.title ?? found.event.name} — ${CHANNEL_LABEL[found.channel] ?? found.channel}`,\n path: `${o.basePath}/${encodeURIComponent(found.event.name)}/${found.channel}`,\n },\n }\n } catch (e) {\n return { ok: false, error: errorMessage(e) }\n }\n },\n }],\n }), [])\n useAgentSurface(agentSurface)\n\n const toggle = async (m: ResolvedMessage, enabled: boolean) => {\n setMessages((prev) => prev?.map((x) =>\n x.event.name === m.event.name && x.channel === m.channel ? { ...x, enabled } : x) ?? null)\n try {\n await store.upsert({ eventKey: m.event.name, channel: m.channel, enabled }, tenantId)\n await reload()\n } catch (err) {\n console.warn('[automations] toggle failed', err)\n toast.error('Não foi possível salvar')\n await reload()\n }\n }\n\n const visible = (messages ?? []).filter((m) => kind === 'all' || m.kind === kind)\n // As linhas do conector não são mensagens, então não têm \"kind\" — aparecem na\n // aba Todos. Contam no total porque estão rodando: omiti-las faria o contador\n // dizer menos automações ativas do que o negócio tem.\n const ownedVisible = kind === 'all' ? owned : []\n const activeCount = (messages ?? []).filter((m) => m.enabled).length + owned.length\n const totalCount = (messages?.length ?? 0) + owned.length\n\n // Agrupa por módulo preservando a ordem de registro dos plugins.\n const groups: { module: string; label: string; items: ResolvedMessage[] }[] = []\n for (const m of visible) {\n let g = groups.find((x) => x.module === m.event.pluginId)\n if (!g) { g = { module: m.event.pluginId, label: m.event.pluginName, items: [] }; groups.push(g) }\n g.items.push(m)\n }\n\n const counter = messages !== null && (\n <span className=\"text-sm text-muted-foreground\">\n {activeCount} de {totalCount} automações ativas\n </span>\n )\n\n return (\n <div className=\"space-y-6\">\n {/* Declarado, não desenhado: o <AskAIButton> cru ficava no cabeçalho no\n celular, onde toda outra tela já entrega a ação ao polegar. */}\n {variant !== 'panel' ? (\n <PageHeaderActions>\n <PageActions\n actions={[{\n id: 'automations-ai',\n label: ASK_AI_ACTION.label,\n icon: WandSparkles,\n intent: 'primary',\n creates: true,\n onSelect: () => askAI({ hint: ASK_AI_ACTION.hint, intro: ASK_AI_ACTION.intro }),\n }]}\n />\n </PageHeaderActions>\n ) : null}\n\n {variant === 'panel' ? (\n <SettingsTabs\n tabs={KIND_TABS.map((t) => ({ id: t.value, label: t.label, IconComp: t.icon }))}\n value={kind}\n onChange={(id) => setKind(id as MessageKind | 'all')}\n aria-label=\"Automações\"\n actions={counter}\n />\n ) : (\n /* Mesma faixa das listas e da sub-nav de módulo. */\n <PageTabs\n className=\"mb-0\"\n tabs={KIND_TABS.map((t) => ({ value: t.value, label: t.label, icon: t.icon }))}\n value={kind}\n onChange={setKind}\n aria-label=\"Automações\"\n actions={counter}\n />\n )}\n\n <p className=\"text-sm text-muted-foreground\">{KIND_HINT[kind]}</p>\n\n {messages === null ? (\n <div className=\"space-y-3\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Card key={i} className=\"p-4\">\n <div className=\"h-4 w-40 animate-pulse rounded bg-muted\" />\n <div className=\"mt-2 h-3 w-64 animate-pulse rounded bg-muted\" />\n </Card>\n ))}\n </div>\n ) : groups.length === 0 && ownedVisible.length === 0 ? (\n <Card className=\"flex flex-col items-center gap-1 p-12 text-center\">\n <Zap className=\"mb-2 h-9 w-9 text-muted-foreground/40\" strokeWidth={1.5} />\n <p className=\"text-base font-semibold\">Nenhuma automação nesta aba</p>\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n Os eventos vêm dos módulos instalados — a loja traz os do pedido, o CRM os do funil.\n </p>\n </Card>\n ) : groups.map((group) => (\n <div key={group.module} className=\"space-y-3\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {group.label}\n </p>\n {group.items.map((m) => {\n const Icon = iconFor(m.event.icon ?? m.event.pluginIcon)\n const ChannelIcon = CHANNEL_ICON[m.channel]\n const href = `${basePath}/${encodeURIComponent(m.event.name)}/${m.channel}`\n // A linha cujo detalhe está aberto na coluna ao lado. Sem a marca,\n // com o rail aberto a lista não diz de QUEM ele fala.\n const isOpen = selected != null\n && decodeURIComponent(selected.eventKey) === m.event.name\n && selected.channel === m.channel\n return (\n <Card\n key={`${m.event.name}:${m.channel}`}\n role=\"button\"\n tabIndex={0}\n aria-current={isOpen || undefined}\n onClick={() => adminNavigateTo(href)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); adminNavigateTo(href) }\n }}\n // Outline, not border/ring: the glass surface forces the card's\n // border-color to transparent and owns its box-shadow, so both\n // utilities are silently defeated there. Outline is the one\n // edge the glass system does not touch, and inline style keeps\n // it out of Tailwind's content-scan lottery.\n style={isOpen ? { outline: '2px solid hsl(var(--primary) / 0.65)', outlineOffset: '-2px' } : undefined}\n className={`cursor-pointer overflow-hidden transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-ring ${\n isOpen ? '' : 'hover:border-primary/40'\n }`}\n >\n <div className=\"flex items-start gap-4 p-4\">\n <span className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-border text-muted-foreground\">\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium\">{m.override?.name ?? m.event.title ?? m.event.name}</p>\n <span className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-[11px] text-muted-foreground\">\n <ChannelIcon className=\"h-3 w-3\" />\n {CHANNEL_LABEL[m.channel]}\n </span>\n {m.customized && (\n <span className=\"rounded-full bg-primary/10 px-2 py-0.5 text-[11px] text-primary\">\n personalizado\n </span>\n )}\n {/* Ligado não quer dizer que vai sair: no WhatsApp a Meta\n ainda precisa aprovar o modelo. */}\n <ProviderTemplateBadge\n approval={providerApprovalFor(providerTemplates, m.event.name, m.channel)}\n />\n </div>\n <p className=\"text-sm text-muted-foreground\">{m.event.description}</p>\n <div className=\"mt-2 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span className=\"inline-flex items-center gap-1\">\n <Zap className=\"h-3 w-3\" />\n {m.event.trigger}\n </span>\n {m.subject && <span className=\"truncate\">Assunto: {m.subject}</span>}\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-3\">\n {/* Switch e não checkbox: isto vale na hora, não quando\n algum Salvar for clicado. */}\n <Switch\n checked={m.enabled}\n onCheckedChange={(next) => void toggle(m, next)}\n label={m.enabled ? 'Ativo' : 'Inativo'}\n aria-label={`${m.event.title} — ${CHANNEL_LABEL[m.channel]}`}\n />\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n </div>\n </Card>\n )\n })}\n </div>\n ))}\n\n {messages !== null && <ConnectorAutomations rows={ownedVisible} />}\n\n {/* O detalhe abre AO LADO da lista, não no lugar dela: escolher o que uma\n automação diz é olhar as outras que já existem, e a tela cheia tirava\n exatamente isso de vista. O nome sai da linha que já está carregada —\n a coluna se nomeia antes de o detalhe terminar de carregar. */}\n {selected && (\n <RightRailPage\n title={\n (messages ?? []).find(\n (m) => m.event.name === decodeURIComponent(selected.eventKey) && m.channel === selected.channel,\n )?.event.title ?? 'Automação'\n }\n open\n onClose={() => adminNavigateTo(basePath)}\n width=\"max-w-2xl\"\n >\n <div className=\"min-h-0 flex-1 overflow-y-auto p-4\">\n <AutomationDetailPage\n eventKey={selected.eventKey}\n channel={selected.channel}\n store={store}\n backTo={basePath}\n embedded\n />\n </div>\n </RightRailPage>\n )}\n </div>\n )\n}\n","import { getSupabaseClientOptional, normalizeMessageActions } from '@fayz-ai/core'\nimport type { MessageTemplate, UpsertMessageTemplateInput } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Acesso aos modelos personalizados. Só as PERSONALIZAÇÕES: o catálogo é\n// código, e uma leitura que falha ainda deve mostrar a lista inteira nos\n// padrões — ver `resolveMessages`.\n// ---------------------------------------------------------------------------\n\nconst TABLE = 'plg_automations_templates'\n\nfunction rowToTemplate(row: any): MessageTemplate {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n eventKey: row.event_key,\n channel: row.channel ?? 'email',\n // NULL fica NULL: quem decide o padrão é o catálogo, não este mapeamento.\n // Colapsar para `false` aqui desligaria em silêncio todo modelo cuja linha\n // só existe porque o texto foi editado.\n enabled: row.enabled ?? null,\n // String vazia e NULL significam a mesma coisa — \"sem personalização\" —,\n // senão um assunto apagado sairia em branco em vez de voltar ao padrão.\n subject: row.subject || null,\n body: row.body || null,\n name: row.name || null,\n // NULL fica NULL pelo mesmo motivo do `enabled`; lista vazia é uma escolha\n // (\"sem botões\"), não a ausência de uma.\n actions: normalizeMessageActions(row.actions),\n updatedAt: row.updated_at ?? row.created_at,\n }\n}\n\nexport interface MessageTemplateStore {\n list(tenantId?: string): Promise<MessageTemplate[]>\n upsert(input: UpsertMessageTemplateInput, tenantId?: string): Promise<MessageTemplate>\n /** Descarta a personalização inteira — a linha some e o padrão volta a valer. */\n reset(eventKey: string, channel: string, tenantId?: string): Promise<void>\n}\n\nexport function createSupabaseTemplateStore(): MessageTemplateStore {\n const db = () => {\n const client = getSupabaseClientOptional()\n if (!client) throw new Error('@fayz-ai/plugin-automations: Supabase client not initialized')\n return client as any\n }\n\n return {\n async list(tenantId) {\n let q = db().from(TABLE).select('*')\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { data, error } = await q\n if (error) throw error\n return (data ?? []).map(rowToTemplate)\n },\n\n async upsert(input, tenantId) {\n const payload: Record<string, unknown> = {\n tenant_id: tenantId,\n event_key: input.eventKey,\n channel: input.channel,\n }\n // Só o que veio: omitir uma chave tem de significar \"não mexa nisso\",\n // senão salvar o texto apagaria o ligado/desligado junto.\n if (input.enabled !== undefined) payload.enabled = input.enabled\n if (input.subject !== undefined) payload.subject = input.subject\n if (input.body !== undefined) payload.body = input.body\n if (input.name !== undefined) payload.name = input.name\n if (input.actions !== undefined) payload.actions = input.actions\n\n const { data, error } = await db()\n .from(TABLE)\n .upsert(payload, { onConflict: 'tenant_id,event_key,channel' })\n .select().single()\n if (error) throw error\n return rowToTemplate(data)\n },\n\n async reset(eventKey, channel, tenantId) {\n let q = db().from(TABLE).delete().eq('event_key', eventKey).eq('channel', channel)\n if (tenantId) q = q.eq('tenant_id', tenantId)\n const { error } = await q\n if (error) throw error\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport { startEventLog } from '@fayz-ai/core'\nimport { resolveFayzAgentConnection, registerRailPage, type RailPageProps } from '@fayz-ai/admin'\nimport { AutomationsList } from './views/AutomationsList'\nimport { AutomationDetailPage } from './views/AutomationDetailPage'\nimport { createSupabaseTemplateStore, type MessageTemplateStore } from './data/templates'\nimport { createFayzTemplateStore } from './data/fayz'\n\n// ---------------------------------------------------------------------------\n// @fayz-ai/plugin-automations — everything the product SENDS, in one place.\n//\n// ONE automation = when THIS happens, send THAT over THIS channel.\n//\n// Events do NOT live here. Each module DECLARES them in its own manifest\n// (`events`) and the runtime aggregates the active plugins' — the store brings\n// the order's, the CRM the pipeline's. If this screen had to import store and\n// CRM, an app installing only the CRM would carry the store catalog too, and\n// every new module would mean another import in here.\n//\n// The same catalog feeds integrations (webhooks) and audit: three readers of the\n// SAME fact, which is why the message text is not part of it.\n// ---------------------------------------------------------------------------\n\nexport interface AutomationsPluginOptions {\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n navLabel?: string\n /**\n * Where the list lives.\n *\n * 'nav' its own menu item (default) — for apps where sending is daily\n * routine, like the store.\n * 'settings' a tab inside settings, no menu item. In a salon the calendar is\n * what runs all day; automations are configured once, and a fixed\n * top-level item charges attention daily for a monthly screen.\n */\n placement?: 'nav' | 'settings'\n scope?: PluginScope\n verticalId?: VerticalId\n /** Swaps data access (tests, mock mode). */\n store?: MessageTemplateStore\n}\n\nexport function createAutomationsPlugin(options?: AutomationsPluginOptions): PluginManifest {\n // Built once per manifest: the store holds no state, and rebuilding it every\n // render would remount the effects that depend on it.\n // Behind a Fayz project the platform executes the automations, so the\n // customisations live there; outside one, the local table keeps working.\n const connection = resolveFayzAgentConnection()\n const store = options?.store\n ?? (connection ? createFayzTemplateStore(connection) : createSupabaseTemplateStore())\n\n // Turns on the trigger history. Idempotent, and from here on EVERY event the\n // app emits is recorded, not only those with a message — it is the same\n // history webhooks and audit read.\n startEventLog()\n\n const inSettings = options?.placement === 'settings'\n\n const ListPage: React.ComponentType<unknown> = () =>\n React.createElement(AutomationsList, { store })\n ListPage.displayName = 'AutomationsList'\n\n // A mesma lista servida DENTRO de Configurações: a shell já nomeou a tela, e\n // as abas têm de ser as dos outros painéis de lá, não a faixa de um módulo.\n // `basePath` leva o detalhe junto — dentro de Configurações ele abre sob\n // `/settings/automations`, para a pessoa não ser jogada para fora da tela.\n const SettingsListPage: React.ComponentType<unknown> = () =>\n React.createElement(AutomationsList, { store, variant: 'panel', basePath: '/settings/automations' })\n SettingsListPage.displayName = 'AutomationsSettings'\n\n // O detalhe, oferecido para quem quiser abri-lo na coluna sem sair da tela em\n // que está. O raio do CRM é o primeiro a pedir: ele aponta para o MESMO fato\n // que a linha do tempo mostra, e mandar a pessoa para outra página para ver\n // \"o que este fato dispara\" custava o funil que ela estava lendo.\n const RailDetail: React.FC<RailPageProps> = ({ params, onClose }) =>\n React.createElement(AutomationDetailPage, {\n eventKey: params.eventKey,\n channel: params.channel,\n store,\n backTo: inSettings ? '/settings/automations' : '/automations',\n embedded: true,\n onDone: onClose,\n })\n RailDetail.displayName = 'AutomationRailDetail'\n registerRailPage('automations.detail', RailDetail)\n\n const READ = { feature: 'automations', action: 'read' as const }\n\n return {\n id: 'automations',\n defaultAgentRole: 'setup',\n name: options?.navLabel ?? 'Automações',\n icon: 'Zap',\n version: '2.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n declaredFeatures: [{ id: 'automations', label: 'Automations', group: 'Automate' }],\n navigation: inSettings ? [] : [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 6,\n label: options?.navLabel ?? 'Automações',\n route: '/automations',\n icon: 'Zap',\n permission: READ,\n indexChild: false,\n },\n ],\n // The SAME list, served inside settings — not a second screen.\n settings: inSettings ? [\n { id: 'automations', label: options?.navLabel ?? 'Automações', icon: 'Zap', component: SettingsListPage, permission: READ },\n ] : [],\n routes: [\n { path: '/automations', component: ListPage, permission: READ },\n // O detalhe de uma automação é a MESMA tela com a coluna da direita\n // aberta — a lista continua atrás dela. Por isso o curinga aponta para o\n // mesmo componente: a shell colapsa '/x' e '/x/*' na mesma chave, então a\n // página não remonta ao abrir o painel (ver AdminShell.routeKey). Um\n // segundo componente aqui traria de volta a troca de tela.\n { path: '/automations/*', component: ListPage, permission: READ },\n ],\n widgets: [],\n }\n}\n\nexport { createSupabaseTemplateStore }\nexport { createFayzTemplateStore } from './data/fayz'\nexport type { MessageTemplateStore }\n// O que a Meta respondeu sobre cada modelo. Exportado porque a decisão \"esta\n// automação de WhatsApp vai mesmo sair?\" é lida fora desta lista — o painel do\n// conector e o provisionamento perguntam a mesma coisa.\nexport {\n loadProviderTemplates, providerTemplateFor, PROVIDER_TEMPLATES_TABLE,\n type ProviderTemplateRow, type ProviderTemplateStatus,\n} from './data/provider-templates'\nexport { providerApprovalFor, type ProviderApproval } from './views/ProviderTemplateStatus'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutomationsList.d.ts","sourceRoot":"","sources":["../../src/views/AutomationsList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AutomationsList.d.ts","sourceRoot":"","sources":["../../src/views/AutomationsList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAkDzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AA+F7D,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,OAAgB,EAAE,QAAyB,EAAE,EAAE;IACtF,KAAK,EAAE,oBAAoB,CAAA;IAC3B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAC3B,qBAgUA"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"status": "preview",
|
|
5
5
|
"dependencies": []
|
|
6
6
|
},
|
|
7
|
-
"version": "0.12.
|
|
7
|
+
"version": "0.12.3",
|
|
8
8
|
"description": "[experimental] Fayz SDK — workflows & automations plugin",
|
|
9
9
|
"type": "module",
|
|
10
10
|
"sideEffects": false,
|
|
@@ -26,10 +26,10 @@
|
|
|
26
26
|
"lucide-react": ">=0.400.0 <1.0.0"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@fayz-ai/core": "^0.
|
|
30
|
-
"@fayz-ai/admin": "^0.
|
|
29
|
+
"@fayz-ai/core": "^0.19.0",
|
|
30
|
+
"@fayz-ai/admin": "^0.19.0",
|
|
31
31
|
"@fayz-ai/sdk": "^0.15.0",
|
|
32
|
-
"@fayz-ai/ui": "^0.
|
|
32
|
+
"@fayz-ai/ui": "^0.19.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/react": "^18.3.0",
|