@supyagent/sdk 0.1.20 → 0.1.21
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/react.cjs +14 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +7 -1
- package/dist/react.d.ts +7 -1
- package/dist/react.js +13 -1
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.tsx","../src/ui/utils.ts","../src/ui/collapsible-result.tsx","../src/ui/provider-icon.tsx","../src/ui/summaries.ts","../src/ui/normalizers.ts","../src/ui/formatters/email.tsx","../src/ui/formatters/calendar-event.tsx","../src/ui/formatters/slack-message.tsx","../src/ui/formatters/github.tsx","../src/ui/formatters/drive-file.tsx","../src/ui/formatters/search.tsx","../src/ui/formatters/docs.tsx","../src/ui/formatters/sheets.tsx","../src/ui/formatters/slides.tsx","../src/ui/formatters/hubspot.tsx","../src/ui/formatters/linear.tsx","../src/ui/formatters/pipedrive.tsx","../src/ui/formatters/compute.tsx","../src/ui/formatters/resend.tsx","../src/ui/formatters/inbox.tsx","../src/ui/formatters/discord.tsx","../src/ui/formatters/notion.tsx","../src/ui/formatters/twitter.tsx","../src/ui/formatters/telegram.tsx","../src/ui/formatters/stripe.tsx","../src/ui/formatters/jira.tsx","../src/ui/formatters/salesforce.tsx","../src/ui/formatters/brevo.tsx","../src/ui/formatters/calendly.tsx","../src/ui/formatters/twilio.tsx","../src/ui/formatters/linkedin.tsx","../src/ui/formatters/generic.tsx","../src/ui/tool-result.tsx","../src/ui/tool-input.tsx","../src/ui/tool-action.tsx","../src/ui/tool-call.tsx"],"sourcesContent":["// ── Data extraction utilities (used by tool-message.tsx) ─────────────────────\nexport {\n extractToolName,\n extractState,\n extractResult,\n extractArgs,\n unwrapSupyagentResult,\n maybeNormalize,\n} from \"./ui/tool-result.js\";\nexport type { ToolResultPart } from \"./ui/tool-result.js\";\n\n// ── Mapping & labels ─────────────────────────────────────────────────────────\nexport {\n getFormatterType,\n getProviderFromToolName,\n humanizeToolName,\n getProviderLabel,\n PROVIDER_LABELS,\n} from \"./ui/utils.js\";\nexport type { FormatterType } from \"./ui/utils.js\";\n\n// ── Summaries ────────────────────────────────────────────────────────────────\nexport { getSummary } from \"./ui/summaries.js\";\nexport type { SummaryResult } from \"./ui/summaries.js\";\n\n// ── Icon component ───────────────────────────────────────────────────────────\nexport { ProviderIcon } from \"./ui/provider-icon.js\";\n\n// ── Input renderer ───────────────────────────────────────────────────────────\nexport { ToolInput } from \"./ui/tool-input.js\";\n\n// ── Normalizers (Microsoft data) ─────────────────────────────────────────────\nexport {\n normalizeMicrosoftMail,\n normalizeMicrosoftCalendar,\n normalizeMicrosoftDrive,\n} from \"./ui/normalizers.js\";\n\n// ── DEPRECATED — kept for backwards compat, will be removed in next major ───\nexport { SupyagentToolAction } from \"./ui/tool-action.js\";\nexport { SupyagentToolResult } from \"./ui/tool-result.js\";\nexport { SupyagentToolCall } from \"./ui/tool-call.js\";\nexport { CollapsibleResult } from \"./ui/collapsible-result.js\";\nexport type { CollapsibleResultProps } from \"./ui/collapsible-result.js\";\n\n// Individual formatters (deprecated — use local tool renderers instead)\nexport { EmailFormatter } from \"./ui/formatters/email.js\";\nexport { CalendarEventFormatter } from \"./ui/formatters/calendar-event.js\";\nexport { SlackMessageFormatter } from \"./ui/formatters/slack-message.js\";\nexport { GithubFormatter } from \"./ui/formatters/github.js\";\nexport { DriveFileFormatter } from \"./ui/formatters/drive-file.js\";\nexport { SearchFormatter } from \"./ui/formatters/search.js\";\nexport { DocsFormatter } from \"./ui/formatters/docs.js\";\nexport { SheetsFormatter } from \"./ui/formatters/sheets.js\";\nexport { SlidesFormatter } from \"./ui/formatters/slides.js\";\nexport { HubspotFormatter } from \"./ui/formatters/hubspot.js\";\nexport { LinearFormatter } from \"./ui/formatters/linear.js\";\nexport { PipedriveFormatter } from \"./ui/formatters/pipedrive.js\";\nexport { ComputeFormatter } from \"./ui/formatters/compute.js\";\nexport { ResendFormatter } from \"./ui/formatters/resend.js\";\nexport { InboxFormatter } from \"./ui/formatters/inbox.js\";\nexport { GenericFormatter } from \"./ui/formatters/generic.js\";\nexport { DiscordFormatter } from \"./ui/formatters/discord.js\";\nexport { NotionFormatter } from \"./ui/formatters/notion.js\";\nexport { TwitterFormatter } from \"./ui/formatters/twitter.js\";\nexport { TelegramFormatter } from \"./ui/formatters/telegram.js\";\nexport { StripeFormatter } from \"./ui/formatters/stripe.js\";\nexport { JiraFormatter } from \"./ui/formatters/jira.js\";\nexport { SalesforceFormatter } from \"./ui/formatters/salesforce.js\";\nexport { BrevoFormatter } from \"./ui/formatters/brevo.js\";\nexport { CalendlyFormatter } from \"./ui/formatters/calendly.js\";\nexport { TwilioFormatter } from \"./ui/formatters/twilio.js\";\nexport { LinkedInFormatter } from \"./ui/formatters/linkedin.js\";\n","/**\n * Extract provider/service prefix from a tool name.\n * Tool names follow `{service}_{action}` convention.\n */\nexport function getProviderFromToolName(toolName: string): string {\n const idx = toolName.indexOf(\"_\");\n return idx > 0 ? toolName.slice(0, idx) : toolName;\n}\n\n/**\n * Convert a tool name like \"gmail_list_messages\" to \"List messages\".\n */\nexport function humanizeToolName(toolName: string): string {\n const idx = toolName.indexOf(\"_\");\n if (idx < 0) return toolName;\n const action = toolName.slice(idx + 1);\n const words = action.replace(/_/g, \" \");\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Provider display names.\n */\nexport const PROVIDER_LABELS: Record<string, string> = {\n gmail: \"Gmail\",\n calendar: \"Calendar\",\n drive: \"Drive\",\n slack: \"Slack\",\n github: \"GitHub\",\n discord: \"Discord\",\n notion: \"Notion\",\n hubspot: \"HubSpot\",\n linkedin: \"LinkedIn\",\n twitter: \"Twitter\",\n telegram: \"Telegram\",\n microsoft: \"Microsoft\",\n outlook: \"Outlook\",\n onedrive: \"OneDrive\",\n whatsapp: \"WhatsApp\",\n inbox: \"Inbox\",\n docs: \"Docs\",\n sheets: \"Sheets\",\n slides: \"Slides\",\n search: \"Search\",\n compute: \"Compute\",\n resend: \"Resend\",\n linear: \"Linear\",\n pipedrive: \"Pipedrive\",\n stripe: \"Stripe\",\n jira: \"Jira\",\n salesforce: \"Salesforce\",\n brevo: \"Brevo\",\n calendly: \"Calendly\",\n twilio: \"Twilio\",\n image: \"Image\",\n audio: \"Audio\",\n video: \"Video\",\n};\n\n/**\n * Get a display label for a provider.\n */\nexport function getProviderLabel(provider: string): string {\n return PROVIDER_LABELS[provider] || provider.charAt(0).toUpperCase() + provider.slice(1);\n}\n\n/**\n * Determine which formatter to use based on tool name prefix.\n */\nexport type FormatterType =\n | \"email\"\n | \"calendar\"\n | \"slack\"\n | \"github\"\n | \"drive\"\n | \"search\"\n | \"docs\"\n | \"sheets\"\n | \"slides\"\n | \"hubspot\"\n | \"linear\"\n | \"pipedrive\"\n | \"compute\"\n | \"resend\"\n | \"inbox\"\n | \"discord\"\n | \"notion\"\n | \"twitter\"\n | \"telegram\"\n | \"stripe\"\n | \"jira\"\n | \"salesforce\"\n | \"brevo\"\n | \"calendly\"\n | \"twilio\"\n | \"linkedin\"\n | \"bash\"\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"generic\";\n\n/**\n * Microsoft tool name prefixes that map to existing Google formatters.\n */\nconst MICROSOFT_PREFIX_MAP: Array<[string, FormatterType]> = [\n [\"microsoft_mail_\", \"email\"],\n [\"microsoft_email_\", \"email\"],\n [\"outlook_\", \"email\"],\n [\"microsoft_calendar_\", \"calendar\"],\n [\"microsoft_drive_\", \"drive\"],\n [\"onedrive_\", \"drive\"],\n];\n\nexport function getFormatterType(toolName: string): FormatterType {\n // Check Microsoft full-name prefixes first\n const lower = toolName.toLowerCase();\n for (const [prefix, type] of MICROSOFT_PREFIX_MAP) {\n if (lower.startsWith(prefix)) return type;\n }\n\n const provider = getProviderFromToolName(toolName);\n switch (provider) {\n case \"gmail\":\n return \"email\";\n case \"calendar\":\n return \"calendar\";\n case \"slack\":\n return \"slack\";\n case \"github\":\n return \"github\";\n case \"drive\":\n return \"drive\";\n case \"search\":\n return \"search\";\n case \"docs\":\n return \"docs\";\n case \"sheets\":\n return \"sheets\";\n case \"slides\":\n return \"slides\";\n case \"hubspot\":\n return \"hubspot\";\n case \"linear\":\n return \"linear\";\n case \"pipedrive\":\n return \"pipedrive\";\n case \"compute\":\n return \"compute\";\n case \"resend\":\n return \"resend\";\n case \"inbox\":\n return \"inbox\";\n case \"discord\":\n return \"discord\";\n case \"notion\":\n return \"notion\";\n case \"twitter\":\n return \"twitter\";\n case \"telegram\":\n return \"telegram\";\n case \"stripe\":\n return \"stripe\";\n case \"jira\":\n return \"jira\";\n case \"salesforce\":\n return \"salesforce\";\n case \"brevo\":\n return \"brevo\";\n case \"calendly\":\n return \"calendly\";\n case \"twilio\":\n return \"twilio\";\n case \"linkedin\":\n return \"linkedin\";\n case \"image\":\n return \"image\";\n case \"tts\":\n case \"stt\":\n return \"audio\";\n case \"video\":\n return \"video\";\n case \"ocr\":\n return \"generic\";\n case \"bash\":\n case \"shell\":\n return \"bash\";\n default:\n return \"generic\";\n }\n}\n","import React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport { getProviderLabel, getProviderFromToolName } from \"./utils.js\";\n\ninterface BadgeProps {\n text: string;\n variant?: \"default\" | \"success\" | \"error\" | \"warning\";\n}\n\nexport interface CollapsibleResultProps {\n toolName: string;\n summary: string;\n badge?: BadgeProps;\n defaultExpanded?: boolean;\n children: React.ReactNode;\n}\n\nconst BADGE_STYLES: Record<string, string> = {\n default: \"bg-muted text-muted-foreground\",\n success: \"bg-green-500/10 text-green-500\",\n error: \"bg-destructive/10 text-destructive\",\n warning: \"bg-yellow-500/10 text-yellow-600\",\n};\n\nexport function CollapsibleResult({\n toolName,\n summary,\n badge,\n defaultExpanded = false,\n children,\n}: CollapsibleResultProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const provider = getProviderFromToolName(toolName);\n const providerLabel = getProviderLabel(provider);\n\n return (\n <div className=\"rounded-lg border border-border bg-card overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-muted transition-colors\"\n >\n <ProviderIcon toolName={toolName} className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">{providerLabel}</span>\n <span className=\"text-sm text-foreground flex-1 truncate\">{summary}</span>\n\n {badge && (\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${\n BADGE_STYLES[badge.variant || \"default\"]\n }`}\n >\n {badge.text}\n </span>\n )}\n\n {expanded ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n )}\n </button>\n\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n style={{ gridTemplateRows: expanded ? \"1fr\" : \"0fr\" }}\n >\n <div className=\"overflow-hidden\">\n <div className=\"border-t border-border px-3 py-2\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport {\n Mail,\n Calendar,\n HardDrive,\n MessageSquare,\n Github,\n type LucideIcon,\n Wrench,\n Bell,\n FileText,\n Table2,\n Presentation,\n Search,\n Terminal,\n Send,\n CircleDot,\n Briefcase,\n Users,\n CreditCard,\n SquareKanban,\n Cloud,\n CalendarClock,\n Phone,\n MessageCircle,\n UserCircle,\n Monitor,\n} from \"lucide-react\";\nimport { getProviderFromToolName } from \"./utils.js\";\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n gmail: Mail,\n calendar: Calendar,\n drive: HardDrive,\n slack: MessageSquare,\n github: Github,\n discord: MessageSquare,\n notion: FileText,\n inbox: Bell,\n docs: FileText,\n sheets: Table2,\n slides: Presentation,\n search: Search,\n compute: Terminal,\n resend: Send,\n linear: CircleDot,\n pipedrive: Briefcase,\n hubspot: Users,\n stripe: CreditCard,\n jira: SquareKanban,\n salesforce: Cloud,\n brevo: Send,\n calendly: CalendarClock,\n twilio: Phone,\n twitter: MessageCircle,\n linkedin: UserCircle,\n microsoft: Monitor,\n outlook: Mail,\n onedrive: HardDrive,\n telegram: Send,\n};\n\ninterface ProviderIconProps {\n toolName: string;\n className?: string;\n}\n\nexport function ProviderIcon({ toolName, className = \"h-4 w-4\" }: ProviderIconProps) {\n const provider = getProviderFromToolName(toolName);\n const Icon = ICON_MAP[provider] || Wrench;\n return <Icon className={className} />;\n}\n","import { humanizeToolName } from \"./utils.js\";\n\nexport interface SummaryResult {\n text: string;\n badge?: { text: string; variant?: \"default\" | \"success\" | \"error\" | \"warning\" };\n}\n\nfunction countItems(data: unknown, ...keys: string[]): number {\n if (Array.isArray(data)) return data.length;\n if (typeof data === \"object\" && data !== null) {\n for (const key of keys) {\n const val = (data as Record<string, unknown>)[key];\n if (Array.isArray(val)) return val.length;\n }\n }\n return 0;\n}\n\nfunction actionFromToolName(toolName: string): string {\n const lower = toolName.toLowerCase();\n if (lower.includes(\"send\") || lower.includes(\"create\") || lower.includes(\"post\")) return \"send\";\n if (lower.includes(\"list\") || lower.includes(\"search\") || lower.includes(\"fetch\") || lower.includes(\"get_all\")) return \"list\";\n return \"get\";\n}\n\nfunction countBadge(n: number): SummaryResult[\"badge\"] | undefined {\n return n > 0 ? { text: String(n), variant: \"default\" } : undefined;\n}\n\nexport function getEmailSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const to = typeof data === \"object\" && data !== null && \"to\" in data\n ? String((data as any).to) : undefined;\n return { text: to ? `Sent email to ${to}` : \"Sent email\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\");\n if (n > 0) return { text: `Listed ${n} emails`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"subject\" in data) {\n return { text: `Email: ${(data as any).subject}` };\n }\n return { text: \"Email result\" };\n}\n\nexport function getCalendarSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const summary = typeof data === \"object\" && data !== null && \"summary\" in data\n ? String((data as any).summary) : undefined;\n return { text: summary ? `Created event: ${summary}` : \"Created event\", badge: { text: \"Created\", variant: \"success\" } };\n }\n const n = countItems(data, \"events\", \"items\");\n if (n > 0) return { text: `Listed ${n} events`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"summary\" in data) {\n return { text: String((data as any).summary) };\n }\n return { text: \"Calendar result\" };\n}\n\nexport function getSlackSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n // Channel list\n if (typeof data === \"object\" && data !== null && \"channels\" in data) {\n const n = Array.isArray((data as any).channels) ? (data as any).channels.length : 0;\n return { text: `Listed ${n} channels`, badge: countBadge(n) };\n }\n if (action === \"send\") {\n const ch = typeof data === \"object\" && data !== null && \"channel\" in data\n ? String((data as any).channel) : undefined;\n return { text: ch ? `Sent message to #${ch}` : \"Sent message\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\");\n if (n > 0) {\n const ch = typeof data === \"object\" && data !== null && \"channel\" in data\n ? String((data as any).channel) : undefined;\n return { text: ch ? `${n} messages in #${ch}` : `${n} messages`, badge: countBadge(n) };\n }\n return { text: \"Slack result\" };\n}\n\nexport function getGithubSummary(data: unknown, toolName: string): SummaryResult {\n const n = countItems(data);\n if (n > 0) {\n const isPR = toolName.toLowerCase().includes(\"pull\") || toolName.toLowerCase().includes(\"pr\");\n return { text: isPR ? `Listed ${n} pull requests` : `Listed ${n} issues`, badge: countBadge(n) };\n }\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n const num = \"number\" in data ? ` #${(data as any).number}` : \"\";\n return { text: `${(data as any).title}${num}` };\n }\n return { text: \"GitHub result\" };\n}\n\nexport function getDriveSummary(data: unknown, toolName: string): SummaryResult {\n const n = countItems(data, \"files\");\n if (n > 0) return { text: `Listed ${n} files`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"name\" in data) {\n return { text: String((data as any).name) };\n }\n return { text: \"Drive result\" };\n}\n\nexport function getSearchSummary(data: unknown): SummaryResult {\n let n = 0;\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.results)) n = d.results.length;\n else if (Array.isArray(d.organic)) n = d.organic.length;\n }\n if (n > 0) return { text: `Found ${n} results`, badge: countBadge(n) };\n return { text: \"Search result\" };\n}\n\nexport function getDocsSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n return { text: `Document: ${(data as any).title}` };\n }\n return { text: \"Document result\" };\n}\n\nexport function getSheetsSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (d.updatedCells) return { text: `Updated ${d.updatedCells} cells`, badge: countBadge(Number(d.updatedCells)) };\n if (d.title) return { text: `Spreadsheet: ${d.title}` };\n }\n return { text: \"Sheets result\" };\n}\n\nexport function getSlidesSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n const slideCount = Array.isArray(d.slides) ? d.slides.length : undefined;\n if (d.title) {\n return { text: `Presentation: ${d.title}`, badge: slideCount ? countBadge(slideCount) : undefined };\n }\n }\n return { text: \"Slides result\" };\n}\n\nexport function getHubspotSummary(data: unknown, toolName: string): SummaryResult {\n const tl = toolName.toLowerCase();\n const isDeal = tl.includes(\"deal\");\n const isCompany = tl.includes(\"compan\");\n const n = countItems(data, \"results\", \"contacts\", \"companies\", \"deals\");\n if (n > 0) {\n const label = isDeal ? \"deals\" : isCompany ? \"companies\" : \"contacts\";\n return { text: `Listed ${n} ${label}`, badge: countBadge(n) };\n }\n if (isDeal) return { text: \"Deal result\" };\n return { text: isCompany ? \"Company result\" : \"Contact result\" };\n}\n\nexport function getLinearSummary(data: unknown, toolName: string): SummaryResult {\n const n = countItems(data, \"nodes\", \"issues\", \"projects\");\n if (n > 0) return { text: `Listed ${n} issues`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"identifier\" in data && \"title\" in data) {\n return { text: `${(data as any).identifier} ${(data as any).title}` };\n }\n return { text: \"Linear result\" };\n}\n\nexport function getPipedriveSummary(data: unknown): SummaryResult {\n const n = countItems(data, \"data\");\n if (n > 0) return { text: `Listed ${n} deals`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n return { text: String((data as any).title) };\n }\n return { text: \"Pipedrive result\" };\n}\n\nexport function getComputeSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n const exitCode = (d.exit_code ?? d.exitCode) as number | undefined;\n if (exitCode !== undefined && exitCode !== 0) {\n return { text: \"Execution failed\", badge: { text: `exit ${exitCode}`, variant: \"error\" } };\n }\n return { text: \"Execution completed\", badge: exitCode !== undefined ? { text: `exit ${exitCode}`, variant: \"success\" } : undefined };\n }\n return { text: \"Compute result\" };\n}\n\nexport function getResendSummary(data: unknown): SummaryResult {\n const d = typeof data === \"object\" && data !== null && \"data\" in data ? (data as any).data : data;\n if (typeof d === \"object\" && d !== null && \"to\" in d) {\n const to = Array.isArray(d.to) ? d.to.join(\", \") : String(d.to);\n return { text: `Sent email to ${to}`, badge: { text: \"Sent\", variant: \"success\" } };\n }\n return { text: \"Email sent\", badge: { text: \"Sent\", variant: \"success\" } };\n}\n\nexport function getInboxSummary(data: unknown): SummaryResult {\n const n = countItems(data, \"events\");\n if (n > 0) return { text: `Listed ${n} notifications`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n return { text: String((data as any).title) };\n }\n return { text: \"Inbox result\" };\n}\n\nexport function getDiscordSummary(data: unknown, toolName: string): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.guilds)) return { text: `Listed ${d.guilds.length} servers`, badge: countBadge(d.guilds.length) };\n if (Array.isArray(d.channels)) return { text: `Listed ${d.channels.length} channels`, badge: countBadge(d.channels.length) };\n }\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const ch = typeof data === \"object\" && data !== null && \"channel\" in data\n ? `#${(data as any).channel}` : undefined;\n return { text: ch ? `Message in ${ch}` : \"Sent message\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\");\n if (n > 0) return { text: `Listed ${n} messages`, badge: countBadge(n) };\n return { text: \"Discord result\" };\n}\n\nexport function getNotionSummary(data: unknown, toolName: string): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.pages)) return { text: `Listed ${d.pages.length} pages`, badge: countBadge(d.pages.length) };\n if (Array.isArray(d.databases)) return { text: `Listed ${d.databases.length} databases`, badge: countBadge(d.databases.length) };\n if (Array.isArray(d.results)) {\n const n = d.results.length;\n const isDB = toolName.toLowerCase().includes(\"database\");\n return { text: isDB ? `Listed ${n} databases` : `Listed ${n} pages`, badge: countBadge(n) };\n }\n }\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n return { text: `Page: ${(data as any).title}` };\n }\n // Check for nested Notion title format\n if (typeof data === \"object\" && data !== null && \"properties\" in data) {\n return { text: \"Page result\" };\n }\n return { text: \"Notion result\" };\n}\n\nexport function getTwitterSummary(data: unknown): SummaryResult {\n const n = countItems(data, \"tweets\", \"data\");\n if (n > 0) return { text: `Listed ${n} tweets`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n const author = d.author_username || d.username;\n if (d.text && author) return { text: `Tweet by @${author}` };\n }\n return { text: \"Twitter result\" };\n}\n\nexport function getTelegramSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const chat = typeof data === \"object\" && data !== null && \"chat\" in data\n ? (data as any).chat?.title || (data as any).chat?.username\n : undefined;\n return { text: chat ? `Sent message to ${chat}` : \"Sent message\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\", \"result\");\n if (n > 0) return { text: `${n} messages`, badge: countBadge(n) };\n return { text: \"Telegram result\" };\n}\n\nexport function getStripeSummary(data: unknown, toolName: string): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n // Balance\n if (Array.isArray(d.available) || Array.isArray(d.pending)) {\n const amt = Array.isArray(d.available) && d.available.length > 0\n ? `${(d.available[0].amount / 100).toFixed(2)} ${String(d.available[0].currency).toUpperCase()}`\n : undefined;\n return { text: amt ? `Balance: ${amt}` : \"Balance\", badge: amt ? { text: amt, variant: \"default\" } : undefined };\n }\n if (Array.isArray(d.data)) {\n const n = d.data.length;\n const lower = toolName.toLowerCase();\n if (lower.includes(\"customer\")) return { text: `Listed ${n} customers`, badge: countBadge(n) };\n if (lower.includes(\"invoice\")) return { text: `Listed ${n} invoices`, badge: countBadge(n) };\n if (lower.includes(\"subscri\")) return { text: `Listed ${n} subscriptions`, badge: countBadge(n) };\n if (lower.includes(\"charge\") || lower.includes(\"payment\")) return { text: `Listed ${n} payments`, badge: countBadge(n) };\n return { text: `Listed ${n} items`, badge: countBadge(n) };\n }\n }\n return { text: \"Stripe result\" };\n}\n\nexport function getJiraSummary(data: unknown): SummaryResult {\n const n = countItems(data, \"issues\", \"projects\");\n if (n > 0) return { text: `Listed ${n} issues`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"key\" in data && \"fields\" in data) {\n const fields = (data as any).fields;\n return { text: `${(data as any).key}: ${fields?.summary || \"Issue\"}` };\n }\n return { text: \"Jira result\" };\n}\n\nexport function getSalesforceSummary(data: unknown, toolName: string): SummaryResult {\n const n = countItems(data, \"records\");\n const isOpp = toolName.toLowerCase().includes(\"opportunit\");\n if (n > 0) return { text: isOpp ? `Listed ${n} opportunities` : `Listed ${n} contacts`, badge: countBadge(n) };\n return { text: \"Salesforce result\" };\n}\n\nexport function getBrevoSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const to = typeof data === \"object\" && data !== null && \"to\" in data\n ? String((data as any).to) : undefined;\n return { text: to ? `Sent email to ${to}` : \"Sent email\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"contacts\", \"campaigns\");\n const isCampaign = toolName.toLowerCase().includes(\"campaign\");\n if (n > 0) return { text: isCampaign ? `Listed ${n} campaigns` : `Listed ${n} contacts`, badge: countBadge(n) };\n return { text: \"Brevo result\" };\n}\n\nexport function getCalendlySummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.collection)) {\n const n = d.collection.length;\n // Detect event types vs scheduled events\n const first = n > 0 ? (d.collection[0] as any) : null;\n const isType = first && (\"duration\" in first || \"slug\" in first);\n return { text: isType ? `Listed ${n} event types` : `Listed ${n} events`, badge: countBadge(n) };\n }\n if (Array.isArray(d.scheduled_events)) return { text: `Listed ${d.scheduled_events.length} events`, badge: countBadge(d.scheduled_events.length) };\n if (Array.isArray(d.event_types)) return { text: `Listed ${d.event_types.length} event types`, badge: countBadge(d.event_types.length) };\n }\n return { text: \"Calendly result\" };\n}\n\nexport function getTwilioSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const to = typeof data === \"object\" && data !== null && \"to\" in data\n ? String((data as any).to) : undefined;\n return { text: to ? `Sent SMS to ${to}` : \"Sent SMS\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\");\n if (n > 0) return { text: `Listed ${n} messages`, badge: countBadge(n) };\n return { text: \"Twilio result\" };\n}\n\nexport function getLinkedinSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.posts) || Array.isArray(d.elements)) {\n const n = (d.posts as unknown[] || d.elements as unknown[]).length;\n return { text: `Listed ${n} posts`, badge: countBadge(n) };\n }\n if (d.localizedFirstName || d.firstName || d.name) {\n const name = d.name || [d.localizedFirstName, d.localizedLastName].filter(Boolean).join(\" \");\n return { text: `Profile: ${name}` };\n }\n }\n return { text: \"LinkedIn result\" };\n}\n\nexport function getImageSummary(data: unknown, toolName: string): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (d.status === \"processing\" || d.poll_url) {\n return { text: \"Generating image...\", badge: { text: \"processing\", variant: \"warning\" } };\n }\n if (d.image_url) {\n return { text: \"Image generated\", badge: { text: \"done\", variant: \"success\" } };\n }\n }\n return { text: humanizeToolName(toolName) };\n}\n\nexport function getAudioSummary(data: unknown, toolName: string): SummaryResult {\n const isTTS = toolName.toLowerCase().startsWith(\"tts\");\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (d.status === \"processing\" || d.poll_url) {\n return {\n text: isTTS ? \"Generating audio...\" : \"Transcribing...\",\n badge: { text: \"processing\", variant: \"warning\" },\n };\n }\n if (d.audio_url) {\n return { text: \"Audio generated\", badge: { text: \"done\", variant: \"success\" } };\n }\n if (d.result && typeof d.result === \"object\" && \"text\" in (d.result as Record<string, unknown>)) {\n return { text: \"Transcription complete\", badge: { text: \"done\", variant: \"success\" } };\n }\n }\n return { text: isTTS ? \"Text-to-speech\" : \"Transcription\" };\n}\n\nexport function getVideoSummary(data: unknown, toolName: string): SummaryResult {\n const isUnderstand = toolName.toLowerCase().includes(\"understand\");\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (d.status === \"processing\" || d.poll_url) {\n return {\n text: isUnderstand ? \"Analyzing video...\" : \"Generating video...\",\n badge: { text: \"processing\", variant: \"warning\" },\n };\n }\n if (d.answer) {\n return { text: \"Video analysis complete\", badge: { text: \"done\", variant: \"success\" } };\n }\n if (d.result && typeof d.result === \"object\") {\n return { text: \"Video generated\", badge: { text: \"done\", variant: \"success\" } };\n }\n }\n return { text: isUnderstand ? \"Video analysis\" : \"Video generation\" };\n}\n\nexport function getBashSummary(data: unknown): SummaryResult {\n if (typeof data !== \"object\" || data === null) return { text: \"Command executed\" };\n const d = data as Record<string, unknown>;\n const exitCode = (d.exitCode ?? d.exit_code ?? 0) as number;\n const timedOut = d.timedOut ?? d.timed_out;\n if (timedOut) return { text: \"Command timed out\", badge: { text: \"timeout\", variant: \"warning\" } };\n if (exitCode === 0) return { text: \"Command succeeded\", badge: { text: \"exit 0\", variant: \"success\" } };\n return { text: `Command failed`, badge: { text: `exit ${exitCode}`, variant: \"error\" } };\n}\n\nexport function getGenericSummary(_data: unknown, toolName: string): SummaryResult {\n return { text: humanizeToolName(toolName) };\n}\n\nexport type SummaryFn = (data: unknown, toolName: string) => SummaryResult;\n\nexport const SUMMARY_MAP: Record<string, SummaryFn> = {\n email: getEmailSummary,\n calendar: getCalendarSummary,\n slack: getSlackSummary,\n github: getGithubSummary,\n drive: getDriveSummary,\n search: getSearchSummary,\n docs: getDocsSummary,\n sheets: getSheetsSummary,\n slides: getSlidesSummary,\n hubspot: getHubspotSummary,\n linear: getLinearSummary,\n pipedrive: getPipedriveSummary,\n compute: getComputeSummary,\n resend: getResendSummary,\n inbox: getInboxSummary,\n discord: getDiscordSummary,\n notion: getNotionSummary,\n twitter: getTwitterSummary,\n telegram: getTelegramSummary,\n stripe: getStripeSummary,\n jira: getJiraSummary,\n salesforce: getSalesforceSummary,\n brevo: getBrevoSummary,\n calendly: getCalendlySummary,\n twilio: getTwilioSummary,\n linkedin: getLinkedinSummary,\n image: getImageSummary,\n audio: getAudioSummary,\n video: getVideoSummary,\n bash: getBashSummary,\n generic: getGenericSummary,\n};\n\nexport function getSummary(formatterType: string, data: unknown, toolName: string): SummaryResult {\n const fn = SUMMARY_MAP[formatterType] || getGenericSummary;\n return fn(data, toolName);\n}\n","/**\n * Normalize Microsoft API responses to match the Google formatter data shapes.\n * This lets us reuse EmailFormatter, CalendarEventFormatter, and DriveFileFormatter.\n */\n\nfunction normalizeMailItem(msg: Record<string, unknown>): Record<string, unknown> {\n return {\n id: msg.id,\n subject: msg.subject,\n from: typeof msg.from === \"object\" && msg.from !== null\n ? (msg.from as any).emailAddress?.address || (msg.from as any).emailAddress?.name\n : msg.from,\n to: Array.isArray(msg.toRecipients)\n ? (msg.toRecipients as any[]).map((r) => r.emailAddress?.address || r.emailAddress?.name).join(\", \")\n : msg.to,\n date: msg.receivedDateTime || msg.createdDateTime || msg.date,\n snippet: msg.bodyPreview || msg.snippet,\n body: typeof msg.body === \"object\" && msg.body !== null ? (msg.body as any).content : msg.body,\n hasAttachments: msg.hasAttachments,\n };\n}\n\nfunction normalizeCalendarItem(evt: Record<string, unknown>): Record<string, unknown> {\n const start = typeof evt.start === \"object\" && evt.start !== null\n ? { dateTime: (evt.start as any).dateTime || (evt.start as any).date, timeZone: (evt.start as any).timeZone }\n : evt.start;\n const end = typeof evt.end === \"object\" && evt.end !== null\n ? { dateTime: (evt.end as any).dateTime || (evt.end as any).date, timeZone: (evt.end as any).timeZone }\n : evt.end;\n\n return {\n id: evt.id,\n summary: evt.subject || evt.summary,\n start,\n end,\n location: typeof evt.location === \"object\" && evt.location !== null\n ? (evt.location as any).displayName\n : evt.location,\n attendees: Array.isArray(evt.attendees)\n ? (evt.attendees as any[]).map((a) => ({\n email: a.emailAddress?.address,\n displayName: a.emailAddress?.name,\n responseStatus: a.status?.response,\n }))\n : evt.attendees,\n status: evt.showAs || evt.status,\n };\n}\n\nfunction normalizeDriveItem(item: Record<string, unknown>): Record<string, unknown> {\n return {\n id: item.id,\n name: item.name,\n mimeType: item.file && typeof item.file === \"object\" ? (item.file as any).mimeType : item.mimeType,\n modifiedTime: item.lastModifiedDateTime || item.modifiedTime,\n size: item.size,\n webViewLink: item.webUrl || item.webViewLink,\n shared: item.shared !== undefined,\n };\n}\n\nfunction normalizeArray(items: unknown[], normalizer: (item: Record<string, unknown>) => Record<string, unknown>): unknown[] {\n return items.map((item) =>\n typeof item === \"object\" && item !== null ? normalizer(item as Record<string, unknown>) : item,\n );\n}\n\nexport function normalizeMicrosoftMail(data: unknown): unknown {\n if (typeof data !== \"object\" || data === null) return data;\n const d = data as Record<string, unknown>;\n\n // Array of messages\n if (Array.isArray(d.value)) {\n return { messages: normalizeArray(d.value, normalizeMailItem) };\n }\n if (Array.isArray(d.messages)) {\n return { messages: normalizeArray(d.messages, normalizeMailItem) };\n }\n // Single message\n if (d.subject || d.from || d.bodyPreview) {\n return normalizeMailItem(d);\n }\n return data;\n}\n\nexport function normalizeMicrosoftCalendar(data: unknown): unknown {\n if (typeof data !== \"object\" || data === null) return data;\n const d = data as Record<string, unknown>;\n\n if (Array.isArray(d.value)) {\n return { events: normalizeArray(d.value, normalizeCalendarItem) };\n }\n if (Array.isArray(d.events)) {\n return { events: normalizeArray(d.events, normalizeCalendarItem) };\n }\n if (d.subject || d.start) {\n return normalizeCalendarItem(d);\n }\n return data;\n}\n\nexport function normalizeMicrosoftDrive(data: unknown): unknown {\n if (typeof data !== \"object\" || data === null) return data;\n const d = data as Record<string, unknown>;\n\n if (Array.isArray(d.value)) {\n return { files: normalizeArray(d.value, normalizeDriveItem) };\n }\n if (Array.isArray(d.files)) {\n return { files: normalizeArray(d.files, normalizeDriveItem) };\n }\n if (d.name && (d.lastModifiedDateTime || d.webUrl)) {\n return normalizeDriveItem(d);\n }\n return data;\n}\n","import React from \"react\";\nimport { Mail, Paperclip, Tag } from \"lucide-react\";\n\ninterface EmailData {\n id?: string;\n subject?: string;\n from?: string;\n to?: string | string[];\n date?: string;\n snippet?: string;\n body?: string;\n hasAttachments?: boolean;\n labels?: string[];\n /** Supyagent API returns labelIds instead of labels */\n labelIds?: string[];\n isUnread?: boolean;\n isStarred?: boolean;\n}\n\ninterface EmailFormatterProps {\n data: unknown;\n}\n\nfunction isEmailData(data: unknown): data is EmailData {\n return typeof data === \"object\" && data !== null && (\"subject\" in data || \"from\" in data || \"snippet\" in data);\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction formatRecipients(to: string | string[] | undefined): string | null {\n if (!to) return null;\n if (Array.isArray(to)) return to.join(\", \");\n return to;\n}\n\n/** Internal Gmail label IDs that shouldn't be shown as tags */\nconst HIDDEN_LABELS = new Set([\"INBOX\", \"UNREAD\", \"SENT\", \"DRAFT\", \"SPAM\", \"TRASH\", \"STARRED\", \"IMPORTANT\"]);\n\nfunction humanizeLabel(label: string): string {\n // \"CATEGORY_UPDATES\" → \"Updates\", \"CATEGORY_PERSONAL\" → \"Personal\"\n if (label.startsWith(\"CATEGORY_\")) return label.slice(9).charAt(0) + label.slice(10).toLowerCase();\n return label;\n}\n\nfunction resolveLabels(email: EmailData): string[] {\n if (email.labels && email.labels.length > 0) return email.labels;\n if (email.labelIds && email.labelIds.length > 0) {\n return email.labelIds\n .filter((id) => !HIDDEN_LABELS.has(id))\n .map(humanizeLabel);\n }\n return [];\n}\n\nfunction EmailCard({ email }: { email: EmailData }) {\n const recipients = formatRecipients(email.to);\n const labels = resolveLabels(email);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <Mail className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {email.subject || \"No subject\"}\n </p>\n {email.from && (\n <p className=\"text-xs text-muted-foreground truncate\">{email.from}</p>\n )}\n {recipients && (\n <p className=\"text-xs text-muted-foreground truncate\">To: {recipients}</p>\n )}\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {email.hasAttachments && (\n <Paperclip className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n {email.date && (\n <span className=\"text-xs text-muted-foreground\">{formatRelativeDate(email.date)}</span>\n )}\n </div>\n </div>\n {labels.length > 0 && (\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n {labels.map((label) => (\n <span\n key={label}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground\"\n >\n <Tag className=\"h-2.5 w-2.5\" />\n {label}\n </span>\n ))}\n </div>\n )}\n {(email.snippet || email.body) && (\n <p className=\"text-xs text-muted-foreground line-clamp-3\">\n {email.snippet || email.body}\n </p>\n )}\n </div>\n );\n}\n\nexport function EmailFormatter({ data }: EmailFormatterProps) {\n if (isEmailData(data)) {\n return <EmailCard email={data} />;\n }\n\n if (Array.isArray(data)) {\n const emails = data.filter(isEmailData);\n if (emails.length > 0) {\n return (\n <div className=\"space-y-2\">\n {emails.map((email, i) => (\n <EmailCard key={email.id || i} email={email} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const messages = (data as { messages: unknown[] }).messages;\n if (Array.isArray(messages)) {\n const emails = messages.filter(isEmailData);\n if (emails.length > 0) {\n return (\n <div className=\"space-y-2\">\n {emails.map((email, i) => (\n <EmailCard key={email.id || i} email={email} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Calendar, MapPin, Users, Check, X, HelpCircle } from \"lucide-react\";\n\ninterface CalendarEventData {\n id?: string;\n summary?: string;\n description?: string;\n start?: { dateTime?: string; date?: string };\n end?: { dateTime?: string; date?: string };\n location?: string;\n attendees?: Array<{\n email?: string;\n displayName?: string;\n responseStatus?: string;\n }>;\n status?: string;\n}\n\ninterface CalendarEventFormatterProps {\n data: unknown;\n}\n\nfunction isCalendarEvent(data: unknown): data is CalendarEventData {\n return typeof data === \"object\" && data !== null && (\"summary\" in data || \"start\" in data);\n}\n\nfunction formatRelativeDateTime(dt?: { dateTime?: string; date?: string }): string {\n if (!dt) return \"\";\n const raw = dt.dateTime || dt.date;\n if (!raw) return \"\";\n try {\n const date = new Date(raw);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n\n const timeStr = dt.dateTime\n ? date.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\" })\n : \"\";\n\n if (diffDays === 0) {\n return timeStr ? `Today at ${timeStr}` : \"Today\";\n }\n if (diffDays === 1) {\n return timeStr ? `Tomorrow at ${timeStr}` : \"Tomorrow\";\n }\n if (diffDays === -1) {\n return timeStr ? `Yesterday at ${timeStr}` : \"Yesterday\";\n }\n if (diffDays > 1 && diffDays < 7) {\n const dayName = date.toLocaleDateString(undefined, { weekday: \"long\" });\n return timeStr ? `${dayName} at ${timeStr}` : dayName;\n }\n\n return dt.dateTime\n ? date.toLocaleString(undefined, { dateStyle: \"medium\", timeStyle: \"short\" })\n : date.toLocaleDateString(undefined, { dateStyle: \"medium\" });\n } catch {\n return raw;\n }\n}\n\nfunction ResponseStatusIcon({ status }: { status?: string }) {\n switch (status) {\n case \"accepted\":\n return <Check className=\"h-3 w-3 text-green-500\" />;\n case \"declined\":\n return <X className=\"h-3 w-3 text-destructive\" />;\n case \"tentative\":\n return <HelpCircle className=\"h-3 w-3 text-yellow-500\" />;\n default:\n return <HelpCircle className=\"h-3 w-3 text-muted-foreground\" />;\n }\n}\n\nfunction EventCard({ event }: { event: CalendarEventData }) {\n const startStr = formatRelativeDateTime(event.start);\n const endStr = formatRelativeDateTime(event.end);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {event.summary || \"Untitled event\"}\n </p>\n {startStr && (\n <p className=\"text-xs text-muted-foreground\">\n {startStr}\n {endStr ? ` \\u2192 ${endStr}` : \"\"}\n </p>\n )}\n </div>\n </div>\n {event.location && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <MapPin className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{event.location}</span>\n </div>\n )}\n {event.attendees && event.attendees.length > 0 && (\n <div className=\"flex items-start gap-1.5 text-xs text-muted-foreground\">\n <Users className=\"h-3 w-3 shrink-0 mt-0.5\" />\n <div className=\"flex flex-wrap gap-x-3 gap-y-1\">\n {event.attendees.map((a, i) => (\n <span key={i} className=\"inline-flex items-center gap-1\">\n <ResponseStatusIcon status={a.responseStatus} />\n {a.displayName || a.email}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport function CalendarEventFormatter({ data }: CalendarEventFormatterProps) {\n if (isCalendarEvent(data)) {\n return <EventCard event={data} />;\n }\n\n if (Array.isArray(data)) {\n const events = data.filter(isCalendarEvent);\n if (events.length > 0) {\n return (\n <div className=\"space-y-2\">\n {events.map((event, i) => (\n <EventCard key={event.id || i} event={event} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"events\" in data) {\n const events = (data as { events: unknown[] }).events;\n if (Array.isArray(events)) {\n const calEvents = events.filter(isCalendarEvent);\n if (calEvents.length > 0) {\n return (\n <div className=\"space-y-2\">\n {calEvents.map((event, i) => (\n <EventCard key={event.id || i} event={event} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { MessageSquare, Hash, Reply } from \"lucide-react\";\n\ninterface SlackMessageData {\n text?: string;\n channel?: string;\n user?: string;\n ts?: string;\n ok?: boolean;\n reactions?: Array<{ name: string; count?: number }>;\n thread_ts?: string;\n reply_count?: number;\n channels?: Array<{ id?: string; name?: string; num_members?: number; memberCount?: number }>;\n}\n\ninterface SlackMessageFormatterProps {\n data: unknown;\n}\n\nfunction isSlackMessage(data: unknown): data is SlackMessageData {\n return typeof data === \"object\" && data !== null && (\"text\" in data || \"channel\" in data);\n}\n\nfunction isChannelList(data: unknown): data is { channels: Array<{ id?: string; name?: string; num_members?: number; memberCount?: number }> } {\n return typeof data === \"object\" && data !== null && \"channels\" in data && Array.isArray((data as any).channels);\n}\n\nfunction MessageBubble({ message }: { message: SlackMessageData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {message.channel && (\n <span className=\"flex items-center gap-0.5 text-xs text-muted-foreground\">\n <Hash className=\"h-3 w-3\" />\n {message.channel}\n </span>\n )}\n {message.user && (\n <span className=\"text-xs font-medium text-foreground\">{message.user}</span>\n )}\n {message.thread_ts && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Reply className=\"h-3 w-3\" />\n {message.reply_count ? `${message.reply_count} replies` : \"Thread\"}\n </span>\n )}\n </div>\n {message.text && (\n <p className=\"text-sm text-foreground\">{message.text}</p>\n )}\n {message.reactions && message.reactions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {message.reactions.map((reaction) => (\n <span\n key={reaction.name}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground\"\n >\n :{reaction.name}:\n {reaction.count && reaction.count > 1 && (\n <span className=\"font-medium\">{reaction.count}</span>\n )}\n </span>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ChannelCard({ channel }: { channel: { id?: string; name?: string; num_members?: number; memberCount?: number } }) {\n const members = channel.num_members ?? channel.memberCount;\n return (\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-card p-3\">\n <Hash className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm text-foreground flex-1\">{channel.name || channel.id}</span>\n {members !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{members} members</span>\n )}\n </div>\n );\n}\n\nexport function SlackMessageFormatter({ data }: SlackMessageFormatterProps) {\n // Channel list response\n if (isChannelList(data)) {\n const channels = (data as any).channels;\n return (\n <div className=\"space-y-1.5\">\n {channels.map((ch: any, i: number) => (\n <ChannelCard key={ch.id || i} channel={ch} />\n ))}\n </div>\n );\n }\n\n if (isSlackMessage(data)) {\n return <MessageBubble message={data} />;\n }\n\n if (Array.isArray(data)) {\n const messages = data.filter(isSlackMessage);\n if (messages.length > 0) {\n return (\n <div className=\"space-y-2\">\n {messages.map((msg, i) => (\n <MessageBubble key={msg.ts || i} message={msg} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const messages = (data as { messages: unknown[] }).messages;\n if (Array.isArray(messages)) {\n const slackMsgs = messages.filter(isSlackMessage);\n if (slackMsgs.length > 0) {\n return (\n <div className=\"space-y-2\">\n {slackMsgs.map((msg, i) => (\n <MessageBubble key={msg.ts || i} message={msg} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { CircleDot, GitPullRequest, GitMerge, Clock } from \"lucide-react\";\n\ninterface GithubItemData {\n title?: string;\n number?: number;\n state?: string;\n html_url?: string;\n body?: string;\n user?: { login?: string };\n created_at?: string;\n pull_request?: unknown;\n merged?: boolean;\n labels?: Array<{ name: string; color?: string }>;\n}\n\ninterface GithubFormatterProps {\n data: unknown;\n}\n\nfunction isGithubItem(data: unknown): data is GithubItemData {\n return typeof data === \"object\" && data !== null && (\"title\" in data || \"number\" in data);\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffDays === 0) return \"today\";\n if (diffDays === 1) return \"yesterday\";\n if (diffDays < 30) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction getStateInfo(item: GithubItemData) {\n const isPR = !!item.pull_request;\n\n if (isPR && item.merged) {\n return { icon: GitMerge, color: \"text-purple-500\", label: \"Merged\" };\n }\n if (item.state === \"open\") {\n return {\n icon: isPR ? GitPullRequest : CircleDot,\n color: \"text-green-500\",\n label: \"Open\",\n };\n }\n return {\n icon: isPR ? GitPullRequest : CircleDot,\n color: \"text-destructive\",\n label: \"Closed\",\n };\n}\n\nfunction GithubCard({ item }: { item: GithubItemData }) {\n const { icon: StateIcon, color: stateColor, label: stateLabel } = getStateInfo(item);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <StateIcon className={`h-4 w-4 mt-0.5 shrink-0 ${stateColor}`} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {item.html_url ? (\n <a href={item.html_url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {item.title}\n </a>\n ) : (\n item.title\n )}\n {item.number && (\n <span className=\"text-muted-foreground font-normal\"> #{item.number}</span>\n )}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className={`text-xs ${stateColor}`}>{stateLabel}</span>\n {item.user?.login && (\n <span className=\"text-xs text-muted-foreground\">{item.user.login}</span>\n )}\n {item.created_at && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate(item.created_at)}\n </span>\n )}\n </div>\n </div>\n </div>\n {item.labels && item.labels.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {item.labels.map((label) => (\n <span\n key={label.name}\n className=\"rounded-full border border-border px-2 py-0.5 text-xs text-muted-foreground\"\n style={\n label.color\n ? { borderColor: `#${label.color}`, color: `#${label.color}` }\n : undefined\n }\n >\n {label.name}\n </span>\n ))}\n </div>\n )}\n {item.body && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{item.body}</p>\n )}\n </div>\n );\n}\n\nexport function GithubFormatter({ data }: GithubFormatterProps) {\n if (isGithubItem(data)) {\n return <GithubCard item={data} />;\n }\n\n if (Array.isArray(data)) {\n const items = data.filter(isGithubItem);\n if (items.length > 0) {\n return (\n <div className=\"space-y-2\">\n {items.map((item, i) => (\n <GithubCard key={item.number || i} item={item} />\n ))}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { FileText, Folder, Image, Film, FileSpreadsheet, ExternalLink, Users as UsersIcon } from \"lucide-react\";\n\ninterface DriveFileData {\n id?: string;\n name?: string;\n mimeType?: string;\n modifiedTime?: string;\n size?: string | number;\n webViewLink?: string;\n shared?: boolean;\n}\n\ninterface DriveFileFormatterProps {\n data: unknown;\n}\n\nfunction isDriveFile(data: unknown): data is DriveFileData {\n return typeof data === \"object\" && data !== null && (\"name\" in data || \"mimeType\" in data);\n}\n\nfunction getFileIcon(mimeType?: string) {\n if (!mimeType) return FileText;\n if (mimeType.includes(\"folder\")) return Folder;\n if (mimeType.includes(\"image\")) return Image;\n if (mimeType.includes(\"video\")) return Film;\n if (mimeType.includes(\"spreadsheet\") || mimeType.includes(\"excel\")) return FileSpreadsheet;\n return FileText;\n}\n\nfunction formatFileSize(size: string | number | undefined): string | null {\n if (size === undefined) return null;\n const bytes = typeof size === \"string\" ? parseInt(size, 10) : size;\n if (isNaN(bytes)) return null;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1048576) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1073741824) return `${(bytes / 1048576).toFixed(1)} MB`;\n return `${(bytes / 1073741824).toFixed(1)} GB`;\n}\n\nfunction FileCard({ file }: { file: DriveFileData }) {\n const Icon = getFileIcon(file.mimeType);\n const sizeStr = formatFileSize(file.size);\n\n return (\n <div className=\"flex items-center gap-3 rounded-lg border border-border bg-card p-3\">\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm text-foreground truncate\">\n {file.webViewLink ? (\n <a href={file.webViewLink} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {file.name || \"Untitled\"}\n </a>\n ) : (\n file.name || \"Untitled\"\n )}\n </p>\n <div className=\"flex items-center gap-2\">\n {file.modifiedTime && (\n <span className=\"text-xs text-muted-foreground\">\n {new Date(file.modifiedTime).toLocaleDateString()}\n </span>\n )}\n {sizeStr && (\n <span className=\"text-xs text-muted-foreground\">{sizeStr}</span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {file.shared && (\n <span title=\"Shared\">\n <UsersIcon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </span>\n )}\n {file.webViewLink && (\n <a href={file.webViewLink} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n </div>\n );\n}\n\nexport function DriveFileFormatter({ data }: DriveFileFormatterProps) {\n if (isDriveFile(data)) {\n return <FileCard file={data} />;\n }\n\n if (Array.isArray(data)) {\n const files = data.filter(isDriveFile);\n if (files.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {files.map((file, i) => (\n <FileCard key={file.id || i} file={file} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"files\" in data) {\n const files = (data as { files: unknown[] }).files;\n if (Array.isArray(files)) {\n const driveFiles = files.filter(isDriveFile);\n if (driveFiles.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {driveFiles.map((file, i) => (\n <FileCard key={file.id || i} file={file} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { ExternalLink, Search } from \"lucide-react\";\n\ninterface SearchResult {\n title?: string;\n link?: string;\n url?: string;\n snippet?: string;\n description?: string;\n position?: number;\n}\n\ninterface SearchData {\n results?: SearchResult[];\n organic?: SearchResult[];\n answer?: string;\n answerBox?: { answer?: string; snippet?: string; title?: string };\n relatedSearches?: Array<{ query?: string }>;\n related_searches?: Array<{ query?: string }>;\n}\n\ninterface SearchFormatterProps {\n data: unknown;\n}\n\nfunction isSearchData(data: unknown): data is SearchData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"results\" in data || \"organic\" in data || \"answer\" in data || \"answerBox\" in data;\n}\n\nfunction isSearchResult(data: unknown): data is SearchResult {\n return typeof data === \"object\" && data !== null && (\"title\" in data || \"link\" in data || \"url\" in data);\n}\n\nfunction getDomain(url: string): string {\n try {\n return new URL(url).hostname.replace(\"www.\", \"\");\n } catch {\n return url;\n }\n}\n\nfunction ResultCard({ result }: { result: SearchResult }) {\n const href = result.link || result.url;\n const snippet = result.snippet || result.description;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n {href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline\"\n >\n {result.title || href}\n </a>\n ) : (\n <p className=\"text-sm font-medium text-foreground\">{result.title}</p>\n )}\n {href && (\n <p className=\"text-xs text-muted-foreground truncate\">{getDomain(href)}</p>\n )}\n </div>\n {href && (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n {snippet && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{snippet}</p>\n )}\n </div>\n );\n}\n\nexport function SearchFormatter({ data }: SearchFormatterProps) {\n if (isSearchData(data)) {\n const results = data.results || data.organic || [];\n const answerText = data.answer || data.answerBox?.answer || data.answerBox?.snippet;\n const related = data.relatedSearches || data.related_searches;\n\n return (\n <div className=\"space-y-3\">\n {answerText && (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <p className=\"text-sm text-foreground\">{answerText}</p>\n {data.answerBox?.title && (\n <p className=\"text-xs text-muted-foreground mt-1\">{data.answerBox.title}</p>\n )}\n </div>\n )}\n\n {results.length > 0 && (\n <div className=\"space-y-2\">\n {results.filter(isSearchResult).map((result, i) => (\n <ResultCard key={result.link || result.url || i} result={result} />\n ))}\n </div>\n )}\n\n {related && related.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {related.map((r, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2.5 py-1 text-xs text-muted-foreground\"\n >\n <Search className=\"h-3 w-3\" />\n {r.query}\n </span>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n // Array of results\n if (Array.isArray(data)) {\n const results = data.filter(isSearchResult);\n if (results.length > 0) {\n return (\n <div className=\"space-y-2\">\n {results.map((result, i) => (\n <ResultCard key={result.link || result.url || i} result={result} />\n ))}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { FileText, ExternalLink } from \"lucide-react\";\n\ninterface DocData {\n documentId?: string;\n title?: string;\n body?: { content?: unknown };\n revisionId?: string;\n url?: string;\n content?: string;\n}\n\ninterface DocsFormatterProps {\n data: unknown;\n}\n\nfunction isDocData(data: unknown): data is DocData {\n return typeof data === \"object\" && data !== null && (\"documentId\" in data || \"title\" in data);\n}\n\nfunction extractTextContent(body: unknown): string | null {\n if (!body || typeof body !== \"object\") return null;\n const content = (body as any).content;\n if (!Array.isArray(content)) return null;\n\n const texts: string[] = [];\n for (const element of content) {\n if (element?.paragraph?.elements) {\n for (const el of element.paragraph.elements) {\n if (el?.textRun?.content) {\n texts.push(el.textRun.content);\n }\n }\n }\n }\n return texts.length > 0 ? texts.join(\"\").trim() : null;\n}\n\nfunction DocCard({ doc }: { doc: DocData }) {\n const docUrl = doc.url || (doc.documentId ? `https://docs.google.com/document/d/${doc.documentId}` : null);\n const textContent = doc.content || extractTextContent(doc.body);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <FileText className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {docUrl ? (\n <a href={docUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {doc.title || \"Untitled document\"}\n </a>\n ) : (\n doc.title || \"Untitled document\"\n )}\n </p>\n </div>\n {docUrl && (\n <a href={docUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n {textContent && (\n <p className=\"text-xs text-muted-foreground line-clamp-4 whitespace-pre-wrap\">{textContent}</p>\n )}\n </div>\n );\n}\n\nexport function DocsFormatter({ data }: DocsFormatterProps) {\n if (isDocData(data)) {\n return <DocCard doc={data} />;\n }\n\n if (Array.isArray(data)) {\n const docs = data.filter(isDocData);\n if (docs.length > 0) {\n return (\n <div className=\"space-y-2\">\n {docs.map((doc, i) => (\n <DocCard key={doc.documentId || i} doc={doc} />\n ))}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Table2, ExternalLink } from \"lucide-react\";\n\ninterface SheetsData {\n spreadsheetId?: string;\n title?: string;\n url?: string;\n values?: unknown[][];\n range?: string;\n updatedRange?: string;\n updatedRows?: number;\n updatedColumns?: number;\n updatedCells?: number;\n sheets?: Array<{ properties?: { title?: string; sheetId?: number } }>;\n}\n\ninterface SheetsFormatterProps {\n data: unknown;\n}\n\nfunction isSheetsData(data: unknown): data is SheetsData {\n return typeof data === \"object\" && data !== null && (\"spreadsheetId\" in data || \"values\" in data || \"range\" in data || \"updatedRange\" in data);\n}\n\nfunction SheetsTable({ values }: { values: unknown[][] }) {\n if (values.length === 0) return null;\n\n const headers = values[0] as string[];\n const rows = values.slice(1);\n\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"border-b border-border bg-muted\">\n {headers.map((header, i) => (\n <th key={i} className=\"px-3 py-2 text-left font-medium text-foreground whitespace-nowrap\">\n {String(header)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr key={rowIdx} className=\"border-b border-border last:border-0\">\n {headers.map((_, colIdx) => (\n <td key={colIdx} className=\"px-3 py-1.5 text-muted-foreground whitespace-nowrap\">\n {String((row as unknown[])[colIdx] ?? \"\")}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction SheetsCard({ sheet }: { sheet: SheetsData }) {\n const sheetUrl = sheet.url || (sheet.spreadsheetId ? `https://docs.google.com/spreadsheets/d/${sheet.spreadsheetId}` : null);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <Table2 className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {sheetUrl ? (\n <a href={sheetUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {sheet.title || \"Spreadsheet\"}\n </a>\n ) : (\n sheet.title || \"Spreadsheet\"\n )}\n </p>\n {(sheet.updatedRange || sheet.range) && (\n <p className=\"text-xs text-muted-foreground\">\n {sheet.updatedRange || sheet.range}\n {sheet.updatedCells !== undefined && ` \\u00B7 ${sheet.updatedCells} cells updated`}\n </p>\n )}\n </div>\n {sheetUrl && (\n <a href={sheetUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n </div>\n\n {sheet.values && sheet.values.length > 0 && (\n <SheetsTable values={sheet.values} />\n )}\n </div>\n );\n}\n\nexport function SheetsFormatter({ data }: SheetsFormatterProps) {\n if (isSheetsData(data)) {\n return <SheetsCard sheet={data} />;\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Presentation, ExternalLink } from \"lucide-react\";\n\ninterface SlidesData {\n presentationId?: string;\n title?: string;\n url?: string;\n slides?: unknown[];\n pageSize?: unknown;\n}\n\ninterface SlidesFormatterProps {\n data: unknown;\n}\n\nfunction isSlidesData(data: unknown): data is SlidesData {\n return typeof data === \"object\" && data !== null && (\"presentationId\" in data || (\"title\" in data && \"slides\" in data));\n}\n\nfunction SlidesCard({ presentation }: { presentation: SlidesData }) {\n const slideUrl = presentation.url || (presentation.presentationId ? `https://docs.google.com/presentation/d/${presentation.presentationId}` : null);\n const slideCount = presentation.slides?.length;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <Presentation className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {slideUrl ? (\n <a href={slideUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {presentation.title || \"Presentation\"}\n </a>\n ) : (\n presentation.title || \"Presentation\"\n )}\n </p>\n {slideCount !== undefined && (\n <p className=\"text-xs text-muted-foreground\">\n {slideCount} {slideCount === 1 ? \"slide\" : \"slides\"}\n </p>\n )}\n </div>\n {slideUrl && (\n <a href={slideUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n </div>\n );\n}\n\nexport function SlidesFormatter({ data }: SlidesFormatterProps) {\n if (isSlidesData(data)) {\n return <SlidesCard presentation={data} />;\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport {\n Users,\n Building2,\n Mail,\n Phone,\n Globe,\n Briefcase,\n DollarSign,\n Calendar,\n} from \"lucide-react\";\n\n/* ------------------------------------------------------------------ */\n/* Interfaces */\n/* ------------------------------------------------------------------ */\n\ninterface HubspotContactData {\n id?: string;\n firstName?: string;\n lastName?: string;\n email?: string;\n phone?: string;\n company?: string;\n properties?: {\n firstname?: string;\n lastname?: string;\n email?: string;\n phone?: string;\n company?: string;\n [key: string]: unknown;\n };\n}\n\ninterface HubspotCompanyData {\n id?: string;\n name?: string;\n domain?: string;\n industry?: string;\n employeeCount?: number | null;\n createdAt?: string;\n updatedAt?: string;\n /** Legacy shape: raw HubSpot properties */\n properties?: {\n name?: string;\n domain?: string;\n industry?: string;\n phone?: string;\n numberofemployees?: string;\n [key: string]: unknown;\n };\n}\n\ninterface HubspotDealData {\n id?: string;\n name?: string;\n amount?: number | null;\n stage?: string;\n closeDate?: string;\n pipeline?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\ninterface HubspotFormatterProps {\n data: unknown;\n}\n\n/* ------------------------------------------------------------------ */\n/* Type guards */\n/* ------------------------------------------------------------------ */\n\nfunction isHubspotContact(data: unknown): data is HubspotContactData {\n if (typeof data !== \"object\" || data === null) return false;\n const d = data as any;\n if (\"firstName\" in d || \"lastName\" in d || (d.email && d.id)) return true;\n const props = d.properties;\n return props && (\"firstname\" in props || \"lastname\" in props || \"email\" in props);\n}\n\nfunction isHubspotCompany(data: unknown): data is HubspotCompanyData {\n if (typeof data !== \"object\" || data === null) return false;\n const d = data as any;\n // Flat shape from Supyagent API (has domain at top level)\n if (\"domain\" in d && !(\"email\" in d) && !(\"amount\" in d)) return true;\n // Legacy raw HubSpot properties shape\n const props = d.properties;\n return props && (\"name\" in props || \"domain\" in props);\n}\n\nfunction isHubspotDeal(data: unknown): data is HubspotDealData {\n if (typeof data !== \"object\" || data === null) return false;\n const d = data as any;\n return (\"amount\" in d || \"stage\" in d || \"closeDate\" in d) && !(\"email\" in d);\n}\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatCurrency(value: number): string {\n try {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return `$${value.toLocaleString()}`;\n }\n}\n\nfunction formatDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return dateStr;\n }\n}\n\nfunction getStageBadge(stage?: string) {\n if (!stage) return null;\n const s = stage.toLowerCase();\n if (s === \"closedwon\" || s === \"closed won\")\n return { label: \"Won\", className: \"text-green-500 bg-green-500/10\" };\n if (s === \"closedlost\" || s === \"closed lost\")\n return { label: \"Lost\", className: \"text-red-400 bg-red-400/10\" };\n // Custom stage IDs — show as \"In Progress\"\n if (/^\\d+$/.test(stage))\n return { label: \"In Progress\", className: \"text-blue-400 bg-blue-400/10\" };\n return { label: stage, className: \"text-muted-foreground bg-muted\" };\n}\n\n/* ------------------------------------------------------------------ */\n/* Cards */\n/* ------------------------------------------------------------------ */\n\nfunction ContactCard({ contact }: { contact: HubspotContactData }) {\n const p = contact.properties || {};\n const first = contact.firstName || p.firstname;\n const last = contact.lastName || p.lastname;\n const email = contact.email || p.email;\n const phone = contact.phone || p.phone;\n const company = contact.company || p.company;\n const name = [first, last].filter(Boolean).join(\" \") || \"Unknown contact\";\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Users className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{name}</p>\n {company && (\n <p className=\"text-xs text-muted-foreground\">{company}</p>\n )}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6\">\n {email && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Mail className=\"h-3 w-3\" />\n {email}\n </span>\n )}\n {phone && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Phone className=\"h-3 w-3\" />\n {phone}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction CompanyCard({ company }: { company: HubspotCompanyData }) {\n const p = company.properties || {};\n const name = company.name || p.name;\n const domain = company.domain || p.domain;\n const industry = company.industry || p.industry;\n const phone = p.phone;\n const employeeCount =\n company.employeeCount ?? (p.numberofemployees ? Number(p.numberofemployees) : null);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Building2 className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {name || \"Unknown company\"}\n </p>\n {industry && (\n <p className=\"text-xs text-muted-foreground\">{industry}</p>\n )}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6 text-xs text-muted-foreground\">\n {domain && (\n <span className=\"flex items-center gap-1\">\n <Globe className=\"h-3 w-3\" />\n {domain}\n </span>\n )}\n {phone && (\n <span className=\"flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {phone}\n </span>\n )}\n {employeeCount != null && employeeCount > 0 && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {employeeCount.toLocaleString()} employees\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction DealCard({ deal }: { deal: HubspotDealData }) {\n const stageBadge = getStageBadge(deal.stage);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Briefcase className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {deal.name || \"Untitled deal\"}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {deal.amount != null && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-foreground\">\n <DollarSign className=\"h-3 w-3\" />\n {formatCurrency(deal.amount)}\n </span>\n )}\n {stageBadge && (\n <span\n className={`rounded-full px-2 py-0.5 text-xs ${stageBadge.className}`}\n >\n {stageBadge.label}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6 text-xs text-muted-foreground\">\n {deal.closeDate && (\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n Close: {formatDate(deal.closeDate)}\n </span>\n )}\n {deal.pipeline && deal.pipeline !== \"default\" && (\n <span>{deal.pipeline}</span>\n )}\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* List wrapper with optional paging indicator */\n/* ------------------------------------------------------------------ */\n\nfunction ListWrapper({\n children,\n hasMore,\n}: {\n children: React.ReactNode;\n hasMore?: boolean;\n}) {\n return (\n <div className=\"space-y-2\">\n {children}\n {hasMore && (\n <p className=\"text-xs text-muted-foreground text-center pt-1\">\n More results available\n </p>\n )}\n </div>\n );\n}\n\nfunction hasPaging(data: unknown): boolean {\n if (typeof data !== \"object\" || data === null) return false;\n const paging = (data as any).paging;\n return paging && typeof paging === \"object\" && paging.next;\n}\n\n/* ------------------------------------------------------------------ */\n/* Formatter */\n/* ------------------------------------------------------------------ */\n\nexport function HubspotFormatter({ data }: HubspotFormatterProps) {\n // Single contact\n if (isHubspotContact(data)) {\n return <ContactCard contact={data} />;\n }\n\n // Single deal\n if (isHubspotDeal(data)) {\n return <DealCard deal={data} />;\n }\n\n // Single company\n if (isHubspotCompany(data)) {\n return <CompanyCard company={data} />;\n }\n\n // Flat array\n if (Array.isArray(data)) {\n const deals = data.filter(isHubspotDeal);\n if (deals.length > 0) {\n return (\n <ListWrapper>\n {deals.map((d, i) => (\n <DealCard key={d.id || i} deal={d} />\n ))}\n </ListWrapper>\n );\n }\n const contacts = data.filter(isHubspotContact);\n if (contacts.length > 0) {\n return (\n <ListWrapper>\n {contacts.map((c, i) => (\n <ContactCard key={c.id || i} contact={c} />\n ))}\n </ListWrapper>\n );\n }\n const companies = data.filter(isHubspotCompany);\n if (companies.length > 0) {\n return (\n <ListWrapper>\n {companies.map((c, i) => (\n <CompanyCard key={c.id || i} company={c} />\n ))}\n </ListWrapper>\n );\n }\n }\n\n // Wrapper objects: { contacts: [...] }, { companies: [...] }, { deals: [...] }\n if (typeof data === \"object\" && data !== null) {\n const d = data as any;\n const more = hasPaging(data);\n\n if (\"contacts\" in d && Array.isArray(d.contacts)) {\n const valid = d.contacts.filter(isHubspotContact);\n if (valid.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {valid.map((c: HubspotContactData, i: number) => (\n <ContactCard key={c.id || i} contact={c} />\n ))}\n </ListWrapper>\n );\n }\n }\n\n if (\"companies\" in d && Array.isArray(d.companies)) {\n const valid = d.companies.filter(isHubspotCompany);\n if (valid.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {valid.map((c: HubspotCompanyData, i: number) => (\n <CompanyCard key={c.id || i} company={c} />\n ))}\n </ListWrapper>\n );\n }\n }\n\n if (\"deals\" in d && Array.isArray(d.deals)) {\n const valid = d.deals.filter(isHubspotDeal);\n if (valid.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {valid.map((deal: HubspotDealData, i: number) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </ListWrapper>\n );\n }\n }\n\n // Raw HubSpot shape: { results: [...] }\n if (\"results\" in d && Array.isArray(d.results)) {\n const results = d.results;\n const deals = results.filter(isHubspotDeal);\n if (deals.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {deals.map((deal: HubspotDealData, i: number) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </ListWrapper>\n );\n }\n const contacts = results.filter(isHubspotContact);\n if (contacts.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {contacts.map((c: HubspotContactData, i: number) => (\n <ContactCard key={c.id || i} contact={c} />\n ))}\n </ListWrapper>\n );\n }\n const companies = results.filter(isHubspotCompany);\n if (companies.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {companies.map((c: HubspotCompanyData, i: number) => (\n <CompanyCard key={c.id || i} company={c} />\n ))}\n </ListWrapper>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { CircleDot, FolderKanban } from \"lucide-react\";\n\ninterface LinearIssueData {\n id?: string;\n title?: string;\n identifier?: string;\n state?: { name?: string; color?: string; type?: string };\n priority?: number;\n priorityLabel?: string;\n assignee?: { name?: string; displayName?: string; email?: string };\n url?: string;\n description?: string;\n}\n\ninterface LinearProjectData {\n id?: string;\n name?: string;\n state?: string;\n progress?: number;\n url?: string;\n description?: string;\n}\n\ninterface LinearFormatterProps {\n data: unknown;\n}\n\nfunction isLinearIssue(data: unknown): data is LinearIssueData {\n if (typeof data !== \"object\" || data === null) return false;\n return (\"title\" in data && (\"identifier\" in data || \"state\" in data || \"priority\" in data));\n}\n\nfunction isLinearProject(data: unknown): data is LinearProjectData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"name\" in data && (\"progress\" in data || (\"state\" in data && typeof (data as any).state === \"string\"));\n}\n\nconst PRIORITY_LABELS: Record<number, { label: string; style: string }> = {\n 0: { label: \"No priority\", style: \"text-muted-foreground\" },\n 1: { label: \"Urgent\", style: \"text-destructive\" },\n 2: { label: \"High\", style: \"text-orange-500\" },\n 3: { label: \"Medium\", style: \"text-yellow-500\" },\n 4: { label: \"Low\", style: \"text-muted-foreground\" },\n};\n\nfunction IssueCard({ issue }: { issue: LinearIssueData }) {\n const priorityInfo = issue.priority !== undefined ? PRIORITY_LABELS[issue.priority] : null;\n const assigneeName = issue.assignee?.displayName || issue.assignee?.name;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <CircleDot\n className=\"h-4 w-4 mt-0.5 shrink-0\"\n style={issue.state?.color ? { color: issue.state.color } : undefined}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {issue.url ? (\n <a href={issue.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {issue.title}\n </a>\n ) : (\n issue.title\n )}\n {issue.identifier && (\n <span className=\"text-muted-foreground font-normal\"> {issue.identifier}</span>\n )}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {issue.state?.name && (\n <span\n className=\"rounded-full bg-muted px-2 py-0.5 text-xs\"\n style={issue.state.color ? { color: issue.state.color } : undefined}\n >\n {issue.state.name}\n </span>\n )}\n {priorityInfo && (\n <span className={`text-xs ${priorityInfo.style}`}>\n {issue.priorityLabel || priorityInfo.label}\n </span>\n )}\n {assigneeName && (\n <span className=\"text-xs text-muted-foreground\">{assigneeName}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ProjectCard({ project }: { project: LinearProjectData }) {\n const progressPercent = project.progress !== undefined ? Math.round(project.progress * 100) : null;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {project.url ? (\n <a href={project.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {project.name}\n </a>\n ) : (\n project.name\n )}\n </p>\n {project.state && (\n <span className=\"text-xs text-muted-foreground\">{project.state}</span>\n )}\n </div>\n </div>\n {progressPercent !== null && (\n <div className=\"space-y-1\">\n <div className=\"h-1.5 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground text-right\">{progressPercent}%</p>\n </div>\n )}\n </div>\n );\n}\n\nexport function LinearFormatter({ data }: LinearFormatterProps) {\n if (isLinearIssue(data)) {\n return <IssueCard issue={data} />;\n }\n\n if (isLinearProject(data)) {\n return <ProjectCard project={data} />;\n }\n\n if (Array.isArray(data)) {\n const issues = data.filter(isLinearIssue);\n if (issues.length > 0) {\n return (\n <div className=\"space-y-2\">\n {issues.map((issue, i) => (\n <IssueCard key={issue.id || i} issue={issue} />\n ))}\n </div>\n );\n }\n const projects = data.filter(isLinearProject);\n if (projects.length > 0) {\n return (\n <div className=\"space-y-2\">\n {projects.map((project, i) => (\n <ProjectCard key={project.id || i} project={project} />\n ))}\n </div>\n );\n }\n }\n\n // Object with nodes/issues array (Linear API pattern)\n if (typeof data === \"object\" && data !== null) {\n const arr = (data as any).nodes || (data as any).issues || (data as any).projects;\n if (Array.isArray(arr)) {\n const issues = arr.filter(isLinearIssue);\n if (issues.length > 0) {\n return (\n <div className=\"space-y-2\">\n {issues.map((issue, i) => (\n <IssueCard key={issue.id || i} issue={issue} />\n ))}\n </div>\n );\n }\n const projects = arr.filter(isLinearProject);\n if (projects.length > 0) {\n return (\n <div className=\"space-y-2\">\n {projects.map((project, i) => (\n <ProjectCard key={project.id || i} project={project} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Briefcase, DollarSign } from \"lucide-react\";\n\ninterface PipedriveDealData {\n id?: number;\n title?: string;\n value?: number;\n currency?: string;\n status?: string;\n stage_id?: number;\n stage_name?: string;\n person_name?: string;\n org_name?: string;\n owner_name?: string;\n}\n\ninterface PipedriveFormatterProps {\n data: unknown;\n}\n\nfunction isPipedriveDeal(data: unknown): data is PipedriveDealData {\n return typeof data === \"object\" && data !== null && (\"title\" in data || \"value\" in data || \"status\" in data) && !(\"subject\" in data);\n}\n\nfunction formatCurrency(value: number, currency?: string): string {\n try {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: currency || \"USD\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return `${currency || \"$\"}${value.toLocaleString()}`;\n }\n}\n\nfunction getStatusBadge(status?: string) {\n switch (status) {\n case \"won\":\n return { label: \"Won\", className: \"text-green-500 bg-green-500/10\" };\n case \"lost\":\n return { label: \"Lost\", className: \"text-destructive bg-destructive/10\" };\n case \"open\":\n return { label: \"Open\", className: \"text-primary bg-primary/10\" };\n case \"deleted\":\n return { label: \"Deleted\", className: \"text-muted-foreground bg-muted\" };\n default:\n return status ? { label: status, className: \"text-muted-foreground bg-muted\" } : null;\n }\n}\n\nfunction DealCard({ deal }: { deal: PipedriveDealData }) {\n const statusBadge = getStatusBadge(deal.status);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Briefcase className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{deal.title || \"Untitled deal\"}</p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {deal.value !== undefined && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-foreground\">\n <DollarSign className=\"h-3 w-3\" />\n {formatCurrency(deal.value, deal.currency)}\n </span>\n )}\n {statusBadge && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${statusBadge.className}`}>\n {statusBadge.label}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6 text-xs text-muted-foreground\">\n {deal.person_name && <span>{deal.person_name}</span>}\n {deal.org_name && <span>{deal.org_name}</span>}\n {deal.stage_name && <span>{deal.stage_name}</span>}\n </div>\n </div>\n );\n}\n\nexport function PipedriveFormatter({ data }: PipedriveFormatterProps) {\n if (isPipedriveDeal(data)) {\n return <DealCard deal={data} />;\n }\n\n if (Array.isArray(data)) {\n const deals = data.filter(isPipedriveDeal);\n if (deals.length > 0) {\n return (\n <div className=\"space-y-2\">\n {deals.map((deal, i) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </div>\n );\n }\n }\n\n // Supyagent API shape: { deals: [...], pagination }\n if (typeof data === \"object\" && data !== null && \"deals\" in data) {\n const items = (data as any).deals;\n if (Array.isArray(items)) {\n const deals = items.filter(isPipedriveDeal);\n if (deals.length > 0) {\n return (\n <div className=\"space-y-2\">\n {deals.map((deal, i) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </div>\n );\n }\n }\n }\n\n // Single deal wrapper: { deal: {...} }\n if (typeof data === \"object\" && data !== null && \"deal\" in data) {\n const item = (data as any).deal;\n if (isPipedriveDeal(item)) {\n return <DealCard deal={item} />;\n }\n }\n\n // Raw Pipedrive shape: { data: [...] }\n if (typeof data === \"object\" && data !== null && \"data\" in data) {\n const items = (data as any).data;\n if (Array.isArray(items)) {\n const deals = items.filter(isPipedriveDeal);\n if (deals.length > 0) {\n return (\n <div className=\"space-y-2\">\n {deals.map((deal, i) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </div>\n );\n }\n }\n if (isPipedriveDeal(items)) {\n return <DealCard deal={items} />;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Terminal, AlertTriangle, Check, X } from \"lucide-react\";\n\ninterface ComputeData {\n stdout?: string;\n stderr?: string;\n exit_code?: number;\n exitCode?: number;\n duration?: number;\n duration_ms?: number;\n output?: string;\n error?: string;\n url?: string;\n files?: Array<{ name?: string; url?: string; size?: number }>;\n}\n\ninterface ComputeFormatterProps {\n data: unknown;\n}\n\nfunction isComputeData(data: unknown): data is ComputeData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"stdout\" in data || \"stderr\" in data || \"exit_code\" in data || \"exitCode\" in data || \"output\" in data;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nexport function ComputeFormatter({ data }: ComputeFormatterProps) {\n if (!isComputeData(data)) {\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n }\n\n const exitCode = data.exit_code ?? data.exitCode;\n const duration = data.duration_ms ?? data.duration;\n const stdout = data.stdout || data.output || \"\";\n const stderr = data.stderr || data.error || \"\";\n const success = exitCode === undefined || exitCode === 0;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"rounded-lg border border-border bg-background overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center gap-2 px-3 py-1.5 bg-muted border-b border-border\">\n <Terminal className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground flex-1\">Output</span>\n <div className=\"flex items-center gap-2\">\n {duration !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{formatDuration(duration)}</span>\n )}\n {exitCode !== undefined && (\n <span className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs ${\n success ? \"text-green-500 bg-green-500/10\" : \"text-destructive bg-destructive/10\"\n }`}>\n {success ? <Check className=\"h-3 w-3\" /> : <X className=\"h-3 w-3\" />}\n exit {exitCode}\n </span>\n )}\n </div>\n </div>\n\n {/* Stdout */}\n {stdout && (\n <pre className=\"p-3 text-xs text-foreground overflow-x-auto max-h-80 overflow-y-auto font-mono whitespace-pre-wrap\">\n {stdout}\n </pre>\n )}\n\n {/* Stderr */}\n {stderr && (\n <div className=\"border-t border-border\">\n <div className=\"flex items-center gap-1.5 px-3 py-1 bg-destructive/5\">\n <AlertTriangle className=\"h-3 w-3 text-destructive\" />\n <span className=\"text-xs text-destructive\">stderr</span>\n </div>\n <pre className=\"p-3 text-xs text-destructive overflow-x-auto max-h-40 overflow-y-auto font-mono whitespace-pre-wrap\">\n {stderr}\n </pre>\n </div>\n )}\n\n {!stdout && !stderr && (\n <p className=\"p-3 text-xs text-muted-foreground italic\">No output</p>\n )}\n </div>\n\n {/* Output files */}\n {data.files && data.files.length > 0 && (\n <div className=\"space-y-1\">\n {data.files.map((file, i) => (\n <div key={i} className=\"flex items-center gap-2 rounded-lg border border-border bg-card p-2\">\n <Terminal className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n {file.url ? (\n <a href={file.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-xs text-primary hover:underline truncate\">\n {file.name || file.url}\n </a>\n ) : (\n <span className=\"text-xs text-foreground truncate\">{file.name}</span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { Send, Clock } from \"lucide-react\";\n\ninterface ResendEmailData {\n id?: string;\n to?: string | string[];\n from?: string;\n subject?: string;\n created_at?: string;\n last_event?: string;\n}\n\ninterface ResendFormatterProps {\n data: unknown;\n}\n\nfunction isResendData(data: unknown): data is ResendEmailData {\n return typeof data === \"object\" && data !== null && (\"id\" in data || \"to\" in data) && (\"subject\" in data || \"from\" in data || \"created_at\" in data);\n}\n\nfunction formatRecipients(to: string | string[] | undefined): string {\n if (!to) return \"Unknown\";\n if (Array.isArray(to)) return to.join(\", \");\n return to;\n}\n\nfunction formatTimestamp(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n return date.toLocaleString(undefined, { dateStyle: \"medium\", timeStyle: \"short\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction ResendCard({ email }: { email: ResendEmailData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-green-500/10 shrink-0\">\n <Send className=\"h-4 w-4 text-green-500\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">Email sent</p>\n {email.subject && (\n <p className=\"text-xs text-muted-foreground truncate\">{email.subject}</p>\n )}\n </div>\n </div>\n <div className=\"pl-10 space-y-1 text-xs text-muted-foreground\">\n <p>\n <span className=\"text-foreground\">To:</span> {formatRecipients(email.to)}\n </p>\n {email.from && (\n <p>\n <span className=\"text-foreground\">From:</span> {email.from}\n </p>\n )}\n {email.created_at && (\n <p className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {formatTimestamp(email.created_at)}\n </p>\n )}\n {email.last_event && (\n <span className=\"inline-block rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground capitalize\">\n {email.last_event}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport function ResendFormatter({ data }: ResendFormatterProps) {\n if (isResendData(data)) {\n return <ResendCard email={data} />;\n }\n\n if (typeof data === \"object\" && data !== null && \"data\" in data) {\n const inner = (data as any).data;\n if (isResendData(inner)) {\n return <ResendCard email={inner} />;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Bell, Calendar, Mail, MessageSquare } from \"lucide-react\";\n\ninterface InboxEventData {\n id?: string;\n /** Legacy fields */\n type?: string;\n title?: string;\n description?: string;\n source?: string;\n timestamp?: string;\n created_at?: string;\n read?: boolean;\n /** Actual API fields */\n event_type?: string;\n summary?: string;\n provider?: string;\n status?: string;\n received_at?: string;\n updated_at?: string;\n payload?: Record<string, unknown>;\n}\n\ninterface InboxFormatterProps {\n data: unknown;\n}\n\nfunction isInboxEvent(data: unknown): data is InboxEventData {\n if (typeof data !== \"object\" || data === null) return false;\n // Actual API shape\n if (\"event_type\" in data || \"summary\" in data) return true;\n // Legacy/mock shape\n if (\"title\" in data || (\"type\" in data && \"source\" in data)) return true;\n return false;\n}\n\nfunction resolveEventType(event: InboxEventData): string | undefined {\n if (event.event_type) {\n // \"email.received\" → \"email\", \"message\" → \"message\"\n return event.event_type.split(\".\")[0];\n }\n return event.type;\n}\n\nfunction getEventIcon(type?: string) {\n switch (type) {\n case \"email\":\n return Mail;\n case \"message\":\n return MessageSquare;\n case \"calendar\":\n return Calendar;\n default:\n return Bell;\n }\n}\n\nfunction formatTimestamp(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffHours < 1) return \"Just now\";\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction EventCard({ event }: { event: InboxEventData }) {\n const eventType = resolveEventType(event);\n const Icon = getEventIcon(eventType);\n const timestamp = event.received_at || event.timestamp || event.created_at;\n const title = event.summary || event.title;\n const source = event.provider || event.source;\n const snippet = event.description || (event.payload?.snippet as string) || (event.payload?.text as string);\n const isUnread = event.status === \"unread\" || event.read === false;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Icon className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n {eventType && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground capitalize\">\n {eventType}\n </span>\n )}\n {source && (\n <span className=\"text-xs text-muted-foreground capitalize\">{source}</span>\n )}\n {isUnread && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\" />\n )}\n {timestamp && (\n <span className=\"text-xs text-muted-foreground ml-auto shrink-0\">\n {formatTimestamp(timestamp)}\n </span>\n )}\n </div>\n {title && (\n <p className=\"text-sm font-medium text-foreground mt-1 line-clamp-1\">{title}</p>\n )}\n </div>\n </div>\n {snippet && (\n <p className=\"text-xs text-muted-foreground line-clamp-2 pl-6\">{snippet}</p>\n )}\n </div>\n );\n}\n\nexport function InboxFormatter({ data }: InboxFormatterProps) {\n if (isInboxEvent(data)) {\n return <EventCard event={data} />;\n }\n\n if (Array.isArray(data)) {\n const events = data.filter(isInboxEvent);\n if (events.length > 0) {\n return (\n <div className=\"space-y-2\">\n {events.map((event, i) => (\n <EventCard key={event.id || i} event={event} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"events\" in data) {\n const events = (data as any).events;\n if (Array.isArray(events)) {\n const inboxEvents = events.filter(isInboxEvent);\n if (inboxEvents.length > 0) {\n return (\n <div className=\"space-y-2\">\n {inboxEvents.map((event, i) => (\n <EventCard key={event.id || i} event={event} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { MessageSquare, Hash, Shield, Users } from \"lucide-react\";\n\ninterface GuildData {\n id?: string;\n name?: string;\n owner?: boolean;\n member_count?: number;\n icon?: string;\n}\n\ninterface ChannelData {\n id?: string;\n name?: string;\n type?: number;\n position?: number;\n member_count?: number;\n}\n\ninterface MessageData {\n id?: string;\n content?: string;\n author?: { username?: string; id?: string };\n timestamp?: string;\n channel_id?: string;\n}\n\ninterface DiscordFormatterProps {\n data: unknown;\n}\n\nfunction isGuildData(data: unknown): data is GuildData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"owner\" in data || \"member_count\" in data || \"icon\" in data);\n}\n\nfunction isChannelData(data: unknown): data is ChannelData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"type\" in data || \"position\" in data);\n}\n\nfunction isMessageData(data: unknown): data is MessageData {\n return typeof data === \"object\" && data !== null && (\"content\" in data || \"author\" in data) && \"id\" in data;\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction GuildCard({ guild }: { guild: GuildData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm font-medium text-foreground flex-1\">{guild.name}</span>\n {guild.owner && (\n <span className=\"rounded-full bg-yellow-500/10 px-2 py-0.5 text-xs text-yellow-600\">Owner</span>\n )}\n </div>\n {guild.member_count !== undefined && (\n <div className=\"flex items-center gap-1 pl-6 text-xs text-muted-foreground\">\n <Users className=\"h-3 w-3\" />\n {guild.member_count} members\n </div>\n )}\n </div>\n );\n}\n\nfunction ChannelCard({ channel }: { channel: ChannelData }) {\n return (\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-card p-3\">\n <Hash className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm text-foreground flex-1\">{channel.name || channel.id}</span>\n {channel.member_count !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{channel.member_count} members</span>\n )}\n </div>\n );\n}\n\nfunction MessageCard({ message }: { message: MessageData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {message.author?.username && (\n <span className=\"text-xs font-medium text-foreground\">{message.author.username}</span>\n )}\n {message.timestamp && (\n <span className=\"text-xs text-muted-foreground ml-auto\">{formatRelativeDate(message.timestamp)}</span>\n )}\n </div>\n {message.content && (\n <p className=\"text-sm text-foreground line-clamp-3\">{message.content}</p>\n )}\n </div>\n );\n}\n\nexport function DiscordFormatter({ data }: DiscordFormatterProps) {\n // Guilds\n if (typeof data === \"object\" && data !== null && \"guilds\" in data) {\n const guilds = (data as any).guilds;\n if (Array.isArray(guilds)) {\n return (\n <div className=\"space-y-1.5\">\n {guilds.filter(isGuildData).map((g, i) => <GuildCard key={g.id || i} guild={g} />)}\n </div>\n );\n }\n }\n\n // Channels\n if (typeof data === \"object\" && data !== null && \"channels\" in data) {\n const channels = (data as any).channels;\n if (Array.isArray(channels)) {\n return (\n <div className=\"space-y-1.5\">\n {channels.filter(isChannelData).map((c, i) => <ChannelCard key={c.id || i} channel={c} />)}\n </div>\n );\n }\n }\n\n // Messages\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const messages = (data as any).messages;\n if (Array.isArray(messages)) {\n return (\n <div className=\"space-y-2\">\n {messages.filter(isMessageData).map((m, i) => <MessageCard key={m.id || i} message={m} />)}\n </div>\n );\n }\n }\n\n // Single message\n if (isMessageData(data)) return <MessageCard message={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const guilds = data.filter(isGuildData);\n if (guilds.length > 0) {\n return (\n <div className=\"space-y-1.5\">{guilds.map((g, i) => <GuildCard key={g.id || i} guild={g} />)}</div>\n );\n }\n const messages = data.filter(isMessageData);\n if (messages.length > 0) {\n return (\n <div className=\"space-y-2\">{messages.map((m, i) => <MessageCard key={m.id || i} message={m} />)}</div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { FileText, Database, ExternalLink, Clock } from \"lucide-react\";\n\ninterface NotionPageData {\n id?: string;\n url?: string;\n last_edited_time?: string;\n lastEditedTime?: string;\n properties?: Record<string, unknown>;\n title?: string;\n}\n\ninterface NotionDatabaseData {\n id?: string;\n title?: string | Array<{ plain_text?: string }>;\n description?: string | Array<{ plain_text?: string }>;\n url?: string;\n lastEditedTime?: string;\n}\n\ninterface NotionFormatterProps {\n data: unknown;\n}\n\nfunction isNotionPage(data: unknown): data is NotionPageData {\n if (typeof data !== \"object\" || data === null) return false;\n // Raw Notion shape with properties\n if (\"properties\" in data) return true;\n // Notion URL-based detection\n if (\"id\" in data && \"url\" in data && String((data as any).url || \"\").includes(\"notion\")) return true;\n // Normalized Supyagent shape: has title + id + parentType (distinguishes from database)\n if (\"title\" in data && \"id\" in data && \"parentType\" in data) return true;\n return false;\n}\n\nfunction isNotionDatabase(data: unknown): data is NotionDatabaseData {\n if (typeof data !== \"object\" || data === null) return false;\n // Raw Notion shape: title is an array\n if (\"title\" in data && Array.isArray((data as any).title) && \"id\" in data) return true;\n // Normalized Supyagent shape: has propertyCount (distinguishes from pages)\n if (\"title\" in data && \"id\" in data && \"propertyCount\" in data) return true;\n return false;\n}\n\nfunction extractPageTitle(page: NotionPageData): string {\n if (page.title) return page.title;\n if (page.properties) {\n for (const val of Object.values(page.properties)) {\n if (typeof val === \"object\" && val !== null && \"title\" in val) {\n const titles = (val as any).title;\n if (Array.isArray(titles) && titles.length > 0) {\n return titles.map((t: any) => t.plain_text || t.text?.content || \"\").join(\"\");\n }\n }\n }\n // Check Name property (common)\n const name = page.properties.Name || page.properties.name;\n if (typeof name === \"object\" && name !== null && \"title\" in name) {\n const titles = (name as any).title;\n if (Array.isArray(titles) && titles.length > 0) {\n return titles.map((t: any) => t.plain_text || \"\").join(\"\");\n }\n }\n }\n return \"Untitled\";\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0) return \"today\";\n if (diffDays === 1) return \"yesterday\";\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction PageCard({ page }: { page: NotionPageData }) {\n const title = extractPageTitle(page);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <FileText className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {page.url ? (\n <a href={page.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {title}\n </a>\n ) : (\n title\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {(page.last_edited_time || page.lastEditedTime) && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate((page.last_edited_time || page.lastEditedTime)!)}\n </span>\n )}\n {page.url && (\n <a href={page.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction DatabaseCard({ db }: { db: NotionDatabaseData }) {\n const title = typeof db.title === \"string\"\n ? db.title\n : Array.isArray(db.title) && db.title.length > 0\n ? db.title.map((t) => t.plain_text || \"\").join(\"\")\n : \"Untitled database\";\n const desc = typeof db.description === \"string\"\n ? db.description\n : Array.isArray(db.description) && db.description.length > 0\n ? db.description.map((d) => d.plain_text || \"\").join(\"\")\n : null;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <Database className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {db.url ? (\n <a href={db.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {title}\n </a>\n ) : (\n title\n )}\n </p>\n {desc && <p className=\"text-xs text-muted-foreground line-clamp-2\">{desc}</p>}\n </div>\n </div>\n </div>\n );\n}\n\nexport function NotionFormatter({ data }: NotionFormatterProps) {\n // Pages array\n if (typeof data === \"object\" && data !== null && \"pages\" in data) {\n const pages = (data as any).pages;\n if (Array.isArray(pages)) {\n return (\n <div className=\"space-y-1.5\">\n {pages.filter(isNotionPage).map((p, i) => <PageCard key={p.id || i} page={p} />)}\n </div>\n );\n }\n }\n\n // Databases array\n if (typeof data === \"object\" && data !== null && \"databases\" in data) {\n const dbs = (data as any).databases;\n if (Array.isArray(dbs)) {\n return (\n <div className=\"space-y-1.5\">\n {dbs.filter(isNotionDatabase).map((d, i) => <DatabaseCard key={d.id || i} db={d} />)}\n </div>\n );\n }\n }\n\n // Results array (query response)\n if (typeof data === \"object\" && data !== null && \"results\" in data) {\n const results = (data as any).results;\n if (Array.isArray(results)) {\n const pages = results.filter(isNotionPage);\n if (pages.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {pages.map((p, i) => <PageCard key={p.id || i} page={p} />)}\n </div>\n );\n }\n const dbs = results.filter(isNotionDatabase);\n if (dbs.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {dbs.map((d, i) => <DatabaseCard key={d.id || i} db={d} />)}\n </div>\n );\n }\n }\n }\n\n // Single page\n if (isNotionPage(data)) return <PageCard page={data} />;\n\n // Single database\n if (isNotionDatabase(data)) return <DatabaseCard db={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const pages = data.filter(isNotionPage);\n if (pages.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {pages.map((p, i) => <PageCard key={p.id || i} page={p} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { MessageCircle, Heart, Repeat2, Clock } from \"lucide-react\";\n\ninterface TweetData {\n id?: string;\n text?: string;\n author_username?: string;\n username?: string;\n author?: { username?: string; name?: string };\n created_at?: string;\n public_metrics?: {\n like_count?: number;\n retweet_count?: number;\n reply_count?: number;\n };\n like_count?: number;\n retweet_count?: number;\n}\n\ninterface TwitterFormatterProps {\n data: unknown;\n}\n\nfunction isTweetData(data: unknown): data is TweetData {\n return typeof data === \"object\" && data !== null && \"text\" in data;\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction TweetCard({ tweet }: { tweet: TweetData }) {\n const username = tweet.author_username || tweet.username || tweet.author?.username;\n const likes = tweet.public_metrics?.like_count ?? tweet.like_count;\n const retweets = tweet.public_metrics?.retweet_count ?? tweet.retweet_count;\n const replies = tweet.public_metrics?.reply_count;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MessageCircle className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {username && (\n <span className=\"text-xs font-medium text-foreground\">@{username}</span>\n )}\n {tweet.author?.name && (\n <span className=\"text-xs text-muted-foreground\">{tweet.author.name}</span>\n )}\n {tweet.created_at && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground ml-auto\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate(tweet.created_at)}\n </span>\n )}\n </div>\n {tweet.text && (\n <p className=\"text-sm text-foreground line-clamp-4\">{tweet.text}</p>\n )}\n {(likes !== undefined || retweets !== undefined || replies !== undefined) && (\n <div className=\"flex items-center gap-4 pt-0.5\">\n {likes !== undefined && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Heart className=\"h-3 w-3\" />\n {likes}\n </span>\n )}\n {retweets !== undefined && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Repeat2 className=\"h-3 w-3\" />\n {retweets}\n </span>\n )}\n {replies !== undefined && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <MessageCircle className=\"h-3 w-3\" />\n {replies}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function TwitterFormatter({ data }: TwitterFormatterProps) {\n // {tweets: [...]}\n if (typeof data === \"object\" && data !== null && \"tweets\" in data) {\n const tweets = (data as any).tweets;\n if (Array.isArray(tweets)) {\n return (\n <div className=\"space-y-2\">\n {tweets.filter(isTweetData).map((t, i) => <TweetCard key={t.id || i} tweet={t} />)}\n </div>\n );\n }\n }\n\n // {data: [...]} (Twitter API v2 shape)\n if (typeof data === \"object\" && data !== null && \"data\" in data && Array.isArray((data as any).data)) {\n const tweets = (data as any).data;\n return (\n <div className=\"space-y-2\">\n {tweets.filter(isTweetData).map((t: TweetData, i: number) => <TweetCard key={t.id || i} tweet={t} />)}\n </div>\n );\n }\n\n if (isTweetData(data)) return <TweetCard tweet={data} />;\n\n if (Array.isArray(data)) {\n const tweets = data.filter(isTweetData);\n if (tweets.length > 0) {\n return (\n <div className=\"space-y-2\">\n {tweets.map((t, i) => <TweetCard key={t.id || i} tweet={t} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { MessageSquare, User, Clock } from \"lucide-react\";\n\ninterface TelegramMessageData {\n message_id?: number;\n text?: string;\n from?: { username?: string; first_name?: string; last_name?: string };\n chat?: { title?: string; username?: string; type?: string };\n date?: number;\n}\n\ninterface TelegramFormatterProps {\n data: unknown;\n}\n\nfunction isTelegramMessage(data: unknown): data is TelegramMessageData {\n return typeof data === \"object\" && data !== null && (\"text\" in data || \"message_id\" in data);\n}\n\nfunction formatUnixDate(ts: number): string {\n try {\n const date = new Date(ts * 1000);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return String(ts);\n }\n}\n\nfunction MessageCard({ message }: { message: TelegramMessageData }) {\n const fromName = message.from\n ? [message.from.first_name, message.from.last_name].filter(Boolean).join(\" \") || message.from.username\n : undefined;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {fromName && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-foreground\">\n <User className=\"h-3 w-3\" />\n {fromName}\n </span>\n )}\n {message.chat?.title && (\n <span className=\"text-xs text-muted-foreground\">{message.chat.title}</span>\n )}\n {message.date && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground ml-auto\">\n <Clock className=\"h-3 w-3\" />\n {formatUnixDate(message.date)}\n </span>\n )}\n </div>\n {message.text && (\n <p className=\"text-sm text-foreground line-clamp-3\">{message.text}</p>\n )}\n </div>\n );\n}\n\nexport function TelegramFormatter({ data }: TelegramFormatterProps) {\n // {messages: [...]}\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const msgs = (data as any).messages;\n if (Array.isArray(msgs)) {\n return (\n <div className=\"space-y-2\">\n {msgs.filter(isTelegramMessage).map((m, i) => <MessageCard key={m.message_id || i} message={m} />)}\n </div>\n );\n }\n }\n\n // {result: [...]} (Bot API shape)\n if (typeof data === \"object\" && data !== null && \"result\" in data) {\n const result = (data as any).result;\n if (Array.isArray(result)) {\n const msgs = result.filter(isTelegramMessage);\n if (msgs.length > 0) {\n return (\n <div className=\"space-y-2\">\n {msgs.map((m, i) => <MessageCard key={m.message_id || i} message={m} />)}\n </div>\n );\n }\n }\n }\n\n if (isTelegramMessage(data)) return <MessageCard message={data} />;\n\n if (Array.isArray(data)) {\n const msgs = data.filter(isTelegramMessage);\n if (msgs.length > 0) {\n return (\n <div className=\"space-y-2\">\n {msgs.map((m, i) => <MessageCard key={m.message_id || i} message={m} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { CreditCard, User, FileText, Clock, RefreshCw } from \"lucide-react\";\n\ninterface StripeCustomerData {\n id?: string;\n name?: string;\n email?: string;\n phone?: string;\n created?: number;\n}\n\ninterface StripeInvoiceData {\n id?: string;\n number?: string;\n amount_due?: number;\n amount_paid?: number;\n currency?: string;\n status?: string;\n customer_name?: string;\n due_date?: number;\n}\n\ninterface StripeSubscriptionData {\n id?: string;\n status?: string;\n plan?: { nickname?: string; amount?: number; currency?: string; interval?: string };\n current_period_start?: number;\n current_period_end?: number;\n}\n\ninterface StripeBalanceData {\n available?: Array<{ amount: number; currency: string }>;\n pending?: Array<{ amount: number; currency: string }>;\n}\n\ninterface StripeFormatterProps {\n data: unknown;\n}\n\nfunction isCustomer(data: unknown): data is StripeCustomerData {\n return typeof data === \"object\" && data !== null && (\"email\" in data || \"name\" in data) && !(\"amount_due\" in data) && !(\"plan\" in data);\n}\n\nfunction isInvoice(data: unknown): data is StripeInvoiceData {\n return typeof data === \"object\" && data !== null && (\"number\" in data || \"amount_due\" in data);\n}\n\nfunction isSubscription(data: unknown): data is StripeSubscriptionData {\n return typeof data === \"object\" && data !== null && \"plan\" in data && \"status\" in data;\n}\n\nfunction isBalance(data: unknown): data is StripeBalanceData {\n return typeof data === \"object\" && data !== null && (\"available\" in data || \"pending\" in data);\n}\n\nfunction formatAmount(amount: number, currency: string): string {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currency.toUpperCase() }).format(amount / 100);\n } catch {\n return `${(amount / 100).toFixed(2)} ${currency.toUpperCase()}`;\n }\n}\n\nfunction formatUnixDate(ts: number): string {\n try {\n return new Date(ts * 1000).toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" });\n } catch {\n return String(ts);\n }\n}\n\nconst STATUS_STYLES: Record<string, string> = {\n paid: \"bg-green-500/10 text-green-500\",\n active: \"bg-green-500/10 text-green-500\",\n open: \"bg-blue-500/10 text-blue-500\",\n draft: \"bg-muted text-muted-foreground\",\n void: \"bg-muted text-muted-foreground\",\n uncollectible: \"bg-destructive/10 text-destructive\",\n past_due: \"bg-destructive/10 text-destructive\",\n canceled: \"bg-destructive/10 text-destructive\",\n trialing: \"bg-yellow-500/10 text-yellow-600\",\n};\n\nfunction StatusBadge({ status }: { status: string }) {\n return (\n <span className={`rounded-full px-2 py-0.5 text-xs ${STATUS_STYLES[status] || \"bg-muted text-muted-foreground\"}`}>\n {status}\n </span>\n );\n}\n\nfunction CustomerCard({ customer }: { customer: StripeCustomerData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{customer.name || \"Unnamed customer\"}</p>\n {customer.email && <p className=\"text-xs text-muted-foreground\">{customer.email}</p>}\n </div>\n </div>\n </div>\n );\n}\n\nfunction InvoiceCard({ invoice }: { invoice: StripeInvoiceData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <FileText className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{invoice.number || invoice.id}</p>\n {invoice.customer_name && <p className=\"text-xs text-muted-foreground\">{invoice.customer_name}</p>}\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {invoice.amount_due !== undefined && invoice.currency && (\n <span className=\"text-sm font-medium text-foreground\">{formatAmount(invoice.amount_due, invoice.currency)}</span>\n )}\n {invoice.status && <StatusBadge status={invoice.status} />}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SubscriptionCard({ sub }: { sub: StripeSubscriptionData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <RefreshCw className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {sub.plan?.nickname || \"Subscription\"}\n {sub.plan?.amount !== undefined && sub.plan?.currency && (\n <span className=\"text-muted-foreground font-normal\"> {formatAmount(sub.plan.amount, sub.plan.currency)}/{sub.plan.interval}</span>\n )}\n </p>\n {sub.current_period_end && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n Renews {formatUnixDate(sub.current_period_end)}\n </p>\n )}\n </div>\n {sub.status && <StatusBadge status={sub.status} />}\n </div>\n </div>\n );\n}\n\nfunction BalanceDisplay({ balance }: { balance: StripeBalanceData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <CreditCard className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">Balance</span>\n </div>\n <div className=\"grid grid-cols-2 gap-4 pl-6\">\n {balance.available && balance.available.length > 0 && (\n <div>\n <p className=\"text-xs text-muted-foreground\">Available</p>\n {balance.available.map((b, i) => (\n <p key={i} className=\"text-sm font-medium text-foreground\">{formatAmount(b.amount, b.currency)}</p>\n ))}\n </div>\n )}\n {balance.pending && balance.pending.length > 0 && (\n <div>\n <p className=\"text-xs text-muted-foreground\">Pending</p>\n {balance.pending.map((b, i) => (\n <p key={i} className=\"text-sm font-medium text-foreground\">{formatAmount(b.amount, b.currency)}</p>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function StripeFormatter({ data }: StripeFormatterProps) {\n // Balance\n if (isBalance(data)) return <BalanceDisplay balance={data} />;\n\n // List response {data: [...]}\n if (typeof data === \"object\" && data !== null && \"data\" in data && Array.isArray((data as any).data)) {\n const items = (data as any).data as unknown[];\n const invoices = items.filter(isInvoice);\n if (invoices.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {invoices.map((inv, i) => <InvoiceCard key={inv.id || i} invoice={inv} />)}\n </div>\n );\n }\n const subs = items.filter(isSubscription);\n if (subs.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {subs.map((s, i) => <SubscriptionCard key={s.id || i} sub={s} />)}\n </div>\n );\n }\n const customers = items.filter(isCustomer);\n if (customers.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {customers.map((c, i) => <CustomerCard key={c.id || i} customer={c} />)}\n </div>\n );\n }\n }\n\n // Single items\n if (isInvoice(data)) return <InvoiceCard invoice={data} />;\n if (isSubscription(data)) return <SubscriptionCard sub={data} />;\n if (isCustomer(data)) return <CustomerCard customer={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const invoices = data.filter(isInvoice);\n if (invoices.length > 0) {\n return <div className=\"space-y-1.5\">{invoices.map((inv, i) => <InvoiceCard key={inv.id || i} invoice={inv} />)}</div>;\n }\n const customers = data.filter(isCustomer);\n if (customers.length > 0) {\n return <div className=\"space-y-1.5\">{customers.map((c, i) => <CustomerCard key={c.id || i} customer={c} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { CircleDot, SquareKanban, User, ArrowUp, ArrowDown, Minus } from \"lucide-react\";\n\ninterface JiraIssueData {\n key?: string;\n id?: string;\n self?: string;\n fields?: {\n summary?: string;\n status?: { name?: string; statusCategory?: { colorName?: string; key?: string } };\n priority?: { name?: string; id?: string };\n assignee?: { displayName?: string; name?: string };\n issuetype?: { name?: string };\n created?: string;\n };\n}\n\ninterface JiraProjectData {\n key?: string;\n id?: string;\n name?: string;\n projectTypeKey?: string;\n self?: string;\n}\n\ninterface JiraFormatterProps {\n data: unknown;\n}\n\nfunction isJiraIssue(data: unknown): data is JiraIssueData {\n return typeof data === \"object\" && data !== null && \"key\" in data && \"fields\" in data;\n}\n\nfunction isJiraProject(data: unknown): data is JiraProjectData {\n return typeof data === \"object\" && data !== null && \"key\" in data && \"name\" in data && \"projectTypeKey\" in data;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n blue: \"bg-blue-500\",\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n \"blue-gray\": \"bg-slate-400\",\n undefined: \"bg-muted-foreground\",\n};\n\nfunction PriorityIcon({ name }: { name?: string }) {\n const lower = (name || \"\").toLowerCase();\n if (lower === \"highest\" || lower === \"critical\") return <ArrowUp className=\"h-3 w-3 text-destructive\" />;\n if (lower === \"high\") return <ArrowUp className=\"h-3 w-3 text-orange-500\" />;\n if (lower === \"low\") return <ArrowDown className=\"h-3 w-3 text-blue-500\" />;\n if (lower === \"lowest\") return <ArrowDown className=\"h-3 w-3 text-green-500\" />;\n return <Minus className=\"h-3 w-3 text-muted-foreground\" />;\n}\n\nfunction IssueCard({ issue }: { issue: JiraIssueData }) {\n const f = issue.fields || {};\n const statusColor = f.status?.statusCategory?.colorName || \"undefined\";\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <CircleDot className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n <span className=\"text-muted-foreground font-normal\">{issue.key}</span>{\" \"}\n {f.summary}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {f.status?.name && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <span className={`h-1.5 w-1.5 rounded-full ${STATUS_COLORS[statusColor] || STATUS_COLORS.undefined}`} />\n {f.status.name}\n </span>\n )}\n {f.priority?.name && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <PriorityIcon name={f.priority.name} />\n {f.priority.name}\n </span>\n )}\n {f.issuetype?.name && (\n <span className=\"text-xs text-muted-foreground\">{f.issuetype.name}</span>\n )}\n {f.assignee && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <User className=\"h-3 w-3\" />\n {f.assignee.displayName || f.assignee.name}\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ProjectCard({ project }: { project: JiraProjectData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <SquareKanban className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n <span className=\"text-muted-foreground font-normal\">{project.key}</span>{\" \"}\n {project.name}\n </p>\n {project.projectTypeKey && (\n <p className=\"text-xs text-muted-foreground\">{project.projectTypeKey}</p>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport function JiraFormatter({ data }: JiraFormatterProps) {\n // {issues: [...]}\n if (typeof data === \"object\" && data !== null && \"issues\" in data) {\n const issues = (data as any).issues;\n if (Array.isArray(issues)) {\n return (\n <div className=\"space-y-1.5\">\n {issues.filter(isJiraIssue).map((iss, i) => <IssueCard key={iss.key || i} issue={iss} />)}\n </div>\n );\n }\n }\n\n // {projects: [...]}\n if (typeof data === \"object\" && data !== null && \"projects\" in data) {\n const projects = (data as any).projects;\n if (Array.isArray(projects)) {\n return (\n <div className=\"space-y-1.5\">\n {projects.filter(isJiraProject).map((p, i) => <ProjectCard key={p.key || i} project={p} />)}\n </div>\n );\n }\n }\n\n // Single issue\n if (isJiraIssue(data)) return <IssueCard issue={data} />;\n\n // Single project\n if (isJiraProject(data)) return <ProjectCard project={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const issues = data.filter(isJiraIssue);\n if (issues.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {issues.map((iss, i) => <IssueCard key={iss.key || i} issue={iss} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { User, Briefcase, Mail, Phone, Building2, Calendar } from \"lucide-react\";\n\ninterface SalesforceContactData {\n Id?: string;\n Name?: string;\n Title?: string;\n Email?: string;\n Phone?: string;\n Account?: { Name?: string } | null;\n AccountName?: string;\n}\n\ninterface SalesforceOpportunityData {\n Id?: string;\n Name?: string;\n Amount?: number;\n StageName?: string;\n CloseDate?: string;\n Probability?: number;\n}\n\ninterface SalesforceFormatterProps {\n data: unknown;\n}\n\nfunction isContact(data: unknown): data is SalesforceContactData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"Name\" in data && (\"Email\" in data || \"Phone\" in data || \"Title\" in data);\n}\n\nfunction isOpportunity(data: unknown): data is SalesforceOpportunityData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"Name\" in data && (\"StageName\" in data || \"Amount\" in data || \"CloseDate\" in data);\n}\n\nfunction ContactCard({ contact }: { contact: SalesforceContactData }) {\n const account = contact.AccountName || contact.Account?.Name;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{contact.Name}</p>\n {contact.Title && <p className=\"text-xs text-muted-foreground\">{contact.Title}</p>}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6\">\n {contact.Email && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Mail className=\"h-3 w-3\" />\n {contact.Email}\n </span>\n )}\n {contact.Phone && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Phone className=\"h-3 w-3\" />\n {contact.Phone}\n </span>\n )}\n {account && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Building2 className=\"h-3 w-3\" />\n {account}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction OpportunityCard({ opp }: { opp: SalesforceOpportunityData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Briefcase className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{opp.Name}</p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {opp.Amount !== undefined && (\n <span className=\"text-xs font-medium text-foreground\">\n {new Intl.NumberFormat(undefined, { style: \"currency\", currency: \"USD\" }).format(opp.Amount)}\n </span>\n )}\n {opp.StageName && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground\">\n {opp.StageName}\n </span>\n )}\n {opp.CloseDate && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Calendar className=\"h-3 w-3\" />\n {opp.CloseDate}\n </span>\n )}\n </div>\n </div>\n </div>\n {opp.Probability !== undefined && (\n <div className=\"pl-6 space-y-0.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">Probability</span>\n <span className=\"text-xs font-medium text-foreground\">{opp.Probability}%</span>\n </div>\n <div className=\"h-1.5 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${Math.min(100, opp.Probability)}%` }}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport function SalesforceFormatter({ data }: SalesforceFormatterProps) {\n // {records: [...]}\n if (typeof data === \"object\" && data !== null && \"records\" in data) {\n const records = (data as any).records;\n if (Array.isArray(records)) {\n const contacts = records.filter(isContact);\n const opps = records.filter(isOpportunity);\n if (opps.length > 0 && contacts.length === 0) {\n return (\n <div className=\"space-y-1.5\">\n {opps.map((o, i) => <OpportunityCard key={o.Id || i} opp={o} />)}\n </div>\n );\n }\n if (contacts.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {contacts.map((c, i) => <ContactCard key={c.Id || i} contact={c} />)}\n </div>\n );\n }\n }\n }\n\n // Single\n if (isOpportunity(data)) return <OpportunityCard opp={data} />;\n if (isContact(data)) return <ContactCard contact={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const contacts = data.filter(isContact);\n if (contacts.length > 0) {\n return <div className=\"space-y-1.5\">{contacts.map((c, i) => <ContactCard key={c.Id || i} contact={c} />)}</div>;\n }\n const opps = data.filter(isOpportunity);\n if (opps.length > 0) {\n return <div className=\"space-y-1.5\">{opps.map((o, i) => <OpportunityCard key={o.Id || i} opp={o} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { User, Mail, BarChart3 } from \"lucide-react\";\n\ninterface BrevoContactData {\n id?: number;\n email?: string;\n attributes?: { FIRSTNAME?: string; LASTNAME?: string; [key: string]: unknown };\n}\n\ninterface BrevoCampaignData {\n id?: number;\n name?: string;\n subject?: string;\n status?: string;\n statistics?: {\n globalStats?: { opened?: number; clicked?: number; sent?: number };\n };\n}\n\ninterface BrevoFormatterProps {\n data: unknown;\n}\n\nfunction isBrevoContact(data: unknown): data is BrevoContactData {\n return typeof data === \"object\" && data !== null && \"email\" in data && (\"attributes\" in data || \"id\" in data);\n}\n\nfunction isBrevoCampaign(data: unknown): data is BrevoCampaignData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"subject\" in data || \"status\" in data);\n}\n\nconst STATUS_STYLES: Record<string, string> = {\n sent: \"bg-green-500/10 text-green-500\",\n draft: \"bg-muted text-muted-foreground\",\n queued: \"bg-blue-500/10 text-blue-500\",\n suspended: \"bg-yellow-500/10 text-yellow-600\",\n archive: \"bg-muted text-muted-foreground\",\n};\n\nfunction ContactCard({ contact }: { contact: BrevoContactData }) {\n const name = contact.attributes\n ? [contact.attributes.FIRSTNAME, contact.attributes.LASTNAME].filter(Boolean).join(\" \")\n : undefined;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n {name && <p className=\"text-sm font-medium text-foreground\">{name}</p>}\n <p className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <Mail className=\"h-3 w-3\" />\n {contact.email}\n </p>\n </div>\n </div>\n </div>\n );\n}\n\nfunction CampaignCard({ campaign }: { campaign: BrevoCampaignData }) {\n const stats = campaign.statistics?.globalStats;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Mail className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{campaign.name}</p>\n {campaign.subject && <p className=\"text-xs text-muted-foreground\">{campaign.subject}</p>}\n </div>\n {campaign.status && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${STATUS_STYLES[campaign.status] || \"bg-muted text-muted-foreground\"}`}>\n {campaign.status}\n </span>\n )}\n </div>\n {stats && (\n <div className=\"flex items-center gap-4 pl-6\">\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <BarChart3 className=\"h-3 w-3\" />\n {stats.sent ?? 0} sent\n </span>\n {stats.opened !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{stats.opened} opened</span>\n )}\n {stats.clicked !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{stats.clicked} clicked</span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function BrevoFormatter({ data }: BrevoFormatterProps) {\n // {contacts: [...]}\n if (typeof data === \"object\" && data !== null && \"contacts\" in data) {\n const contacts = (data as any).contacts;\n if (Array.isArray(contacts)) {\n return (\n <div className=\"space-y-1.5\">\n {contacts.filter(isBrevoContact).map((c, i) => <ContactCard key={c.id || i} contact={c} />)}\n </div>\n );\n }\n }\n\n // {campaigns: [...]}\n if (typeof data === \"object\" && data !== null && \"campaigns\" in data) {\n const campaigns = (data as any).campaigns;\n if (Array.isArray(campaigns)) {\n return (\n <div className=\"space-y-1.5\">\n {campaigns.filter(isBrevoCampaign).map((c, i) => <CampaignCard key={c.id || i} campaign={c} />)}\n </div>\n );\n }\n }\n\n if (isBrevoContact(data)) return <ContactCard contact={data} />;\n if (isBrevoCampaign(data)) return <CampaignCard campaign={data} />;\n\n if (Array.isArray(data)) {\n const contacts = data.filter(isBrevoContact);\n if (contacts.length > 0) {\n return <div className=\"space-y-1.5\">{contacts.map((c, i) => <ContactCard key={c.id || i} contact={c} />)}</div>;\n }\n const campaigns = data.filter(isBrevoCampaign);\n if (campaigns.length > 0) {\n return <div className=\"space-y-1.5\">{campaigns.map((c, i) => <CampaignCard key={c.id || i} campaign={c} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Calendar, Clock, MapPin } from \"lucide-react\";\n\ninterface CalendlyEventData {\n uri?: string;\n name?: string;\n status?: string;\n start_time?: string;\n end_time?: string;\n location?: { type?: string; location?: string };\n event_type?: string;\n}\n\ninterface CalendlyEventTypeData {\n uri?: string;\n name?: string;\n duration?: number;\n active?: boolean;\n slug?: string;\n description_plain?: string;\n}\n\ninterface CalendlyFormatterProps {\n data: unknown;\n}\n\nfunction isCalendlyEvent(data: unknown): data is CalendlyEventData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"start_time\" in data || \"status\" in data);\n}\n\nfunction isCalendlyEventType(data: unknown): data is CalendlyEventTypeData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"duration\" in data || \"slug\" in data || \"active\" in data);\n}\n\nfunction formatDateTime(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n } catch {\n return dateStr;\n }\n}\n\nconst STATUS_STYLES: Record<string, string> = {\n active: \"bg-green-500/10 text-green-500\",\n canceled: \"bg-destructive/10 text-destructive\",\n};\n\nfunction EventCard({ event }: { event: CalendlyEventData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{event.name}</p>\n {event.start_time && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatDateTime(event.start_time)}\n {event.end_time && ` - ${formatDateTime(event.end_time)}`}\n </p>\n )}\n {event.location?.location && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <MapPin className=\"h-3 w-3\" />\n {event.location.location}\n </p>\n )}\n </div>\n {event.status && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${STATUS_STYLES[event.status] || \"bg-muted text-muted-foreground\"}`}>\n {event.status}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction EventTypeCard({ eventType }: { eventType: CalendlyEventTypeData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{eventType.name}</p>\n {eventType.description_plain && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{eventType.description_plain}</p>\n )}\n {eventType.duration !== undefined && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {eventType.duration} min\n </p>\n )}\n </div>\n {eventType.active !== undefined && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${eventType.active ? \"bg-green-500/10 text-green-500\" : \"bg-muted text-muted-foreground\"}`}>\n {eventType.active ? \"Active\" : \"Inactive\"}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport function CalendlyFormatter({ data }: CalendlyFormatterProps) {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n\n // {collection: [...]}\n if (Array.isArray(d.collection)) {\n const events = d.collection.filter(isCalendlyEvent);\n const types = d.collection.filter(isCalendlyEventType);\n if (types.length > 0 && events.length === 0) {\n return <div className=\"space-y-1.5\">{types.map((t, i) => <EventTypeCard key={t.uri || i} eventType={t} />)}</div>;\n }\n if (events.length > 0) {\n return <div className=\"space-y-1.5\">{events.map((e, i) => <EventCard key={e.uri || i} event={e} />)}</div>;\n }\n }\n\n // {scheduled_events: [...]}\n if (Array.isArray(d.scheduled_events)) {\n return (\n <div className=\"space-y-1.5\">\n {d.scheduled_events.filter(isCalendlyEvent).map((e: CalendlyEventData, i: number) => <EventCard key={e.uri || i} event={e} />)}\n </div>\n );\n }\n\n // {event_types: [...]}\n if (Array.isArray(d.event_types)) {\n return (\n <div className=\"space-y-1.5\">\n {d.event_types.filter(isCalendlyEventType).map((t: CalendlyEventTypeData, i: number) => <EventTypeCard key={t.uri || i} eventType={t} />)}\n </div>\n );\n }\n }\n\n if (isCalendlyEvent(data)) return <EventCard event={data} />;\n if (isCalendlyEventType(data)) return <EventTypeCard eventType={data} />;\n\n if (Array.isArray(data)) {\n const events = data.filter(isCalendlyEvent);\n if (events.length > 0) {\n return <div className=\"space-y-1.5\">{events.map((e, i) => <EventCard key={e.uri || i} event={e} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Phone, ArrowUpRight, ArrowDownLeft, Clock } from \"lucide-react\";\n\ninterface TwilioMessageData {\n sid?: string;\n from?: string;\n to?: string;\n body?: string;\n status?: string;\n direction?: string;\n date_sent?: string;\n date_created?: string;\n}\n\ninterface TwilioFormatterProps {\n data: unknown;\n}\n\nfunction isTwilioMessage(data: unknown): data is TwilioMessageData {\n return typeof data === \"object\" && data !== null && (\"body\" in data || \"sid\" in data) && (\"from\" in data || \"to\" in data);\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nconst STATUS_STYLES: Record<string, string> = {\n delivered: \"bg-green-500/10 text-green-500\",\n sent: \"bg-green-500/10 text-green-500\",\n received: \"bg-blue-500/10 text-blue-500\",\n failed: \"bg-destructive/10 text-destructive\",\n undelivered: \"bg-destructive/10 text-destructive\",\n queued: \"bg-yellow-500/10 text-yellow-600\",\n sending: \"bg-blue-500/10 text-blue-500\",\n};\n\nfunction MessageCard({ message }: { message: TwilioMessageData }) {\n const isInbound = message.direction?.includes(\"inbound\");\n const DirectionIcon = isInbound ? ArrowDownLeft : ArrowUpRight;\n const dateStr = message.date_sent || message.date_created;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <Phone className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <DirectionIcon className=\"h-3 w-3 text-muted-foreground shrink-0\" />\n <div className=\"flex items-center gap-1.5 flex-1 min-w-0\">\n {message.from && <span className=\"text-xs text-muted-foreground\">{message.from}</span>}\n <span className=\"text-xs text-muted-foreground\">→</span>\n {message.to && <span className=\"text-xs text-muted-foreground\">{message.to}</span>}\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {message.status && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${STATUS_STYLES[message.status] || \"bg-muted text-muted-foreground\"}`}>\n {message.status}\n </span>\n )}\n {dateStr && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate(dateStr)}\n </span>\n )}\n </div>\n </div>\n {message.body && (\n <p className=\"text-sm text-foreground line-clamp-3\">{message.body}</p>\n )}\n </div>\n );\n}\n\nexport function TwilioFormatter({ data }: TwilioFormatterProps) {\n // {messages: [...]}\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const msgs = (data as any).messages;\n if (Array.isArray(msgs)) {\n return (\n <div className=\"space-y-1.5\">\n {msgs.filter(isTwilioMessage).map((m, i) => <MessageCard key={m.sid || i} message={m} />)}\n </div>\n );\n }\n }\n\n if (isTwilioMessage(data)) return <MessageCard message={data} />;\n\n if (Array.isArray(data)) {\n const msgs = data.filter(isTwilioMessage);\n if (msgs.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {msgs.map((m, i) => <MessageCard key={m.sid || i} message={m} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { User, FileText, ExternalLink, Clock } from \"lucide-react\";\n\ninterface LinkedInProfileData {\n id?: string;\n localizedFirstName?: string;\n localizedLastName?: string;\n firstName?: string;\n lastName?: string;\n name?: string;\n headline?: string;\n vanityName?: string;\n profilePicture?: unknown;\n}\n\ninterface LinkedInPostData {\n id?: string;\n text?: string;\n commentary?: string;\n created?: { time?: number };\n timestamp?: string;\n author?: string;\n}\n\ninterface LinkedInFormatterProps {\n data: unknown;\n}\n\nfunction isProfile(data: unknown): data is LinkedInProfileData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"localizedFirstName\" in data || \"firstName\" in data || (\"name\" in data && \"headline\" in data);\n}\n\nfunction isPost(data: unknown): data is LinkedInPostData {\n if (typeof data !== \"object\" || data === null) return false;\n return (\"text\" in data || \"commentary\" in data) && !(\"localizedFirstName\" in data);\n}\n\nfunction formatRelativeDate(dateStr: string | number): string {\n try {\n const date = typeof dateStr === \"number\" ? new Date(dateStr) : new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0) return \"today\";\n if (diffDays === 1) return \"yesterday\";\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return String(dateStr);\n }\n}\n\nfunction ProfileCard({ profile }: { profile: LinkedInProfileData }) {\n const name = profile.name ||\n [profile.localizedFirstName || profile.firstName, profile.localizedLastName || profile.lastName]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{name || \"LinkedIn Profile\"}</p>\n {profile.headline && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{profile.headline}</p>\n )}\n {profile.vanityName && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <ExternalLink className=\"h-3 w-3\" />\n linkedin.com/in/{profile.vanityName}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction PostCard({ post }: { post: LinkedInPostData }) {\n const content = post.text || post.commentary;\n const time = post.created?.time || post.timestamp;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {post.author && (\n <span className=\"text-xs font-medium text-foreground\">{post.author}</span>\n )}\n {time && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground ml-auto\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate(time)}\n </span>\n )}\n </div>\n {content && (\n <p className=\"text-sm text-foreground line-clamp-4\">{content}</p>\n )}\n </div>\n );\n}\n\nexport function LinkedInFormatter({ data }: LinkedInFormatterProps) {\n // Profile\n if (isProfile(data)) return <ProfileCard profile={data} />;\n\n // {posts: [...]}\n if (typeof data === \"object\" && data !== null && \"posts\" in data) {\n const posts = (data as any).posts;\n if (Array.isArray(posts)) {\n return (\n <div className=\"space-y-1.5\">\n {posts.filter(isPost).map((p, i) => <PostCard key={p.id || i} post={p} />)}\n </div>\n );\n }\n }\n\n // {elements: [...]}\n if (typeof data === \"object\" && data !== null && \"elements\" in data) {\n const elements = (data as any).elements;\n if (Array.isArray(elements)) {\n const posts = elements.filter(isPost);\n if (posts.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {posts.map((p, i) => <PostCard key={p.id || i} post={p} />)}\n </div>\n );\n }\n }\n }\n\n if (isPost(data)) return <PostCard post={data} />;\n\n if (Array.isArray(data)) {\n const posts = data.filter(isPost);\n if (posts.length > 0) {\n return <div className=\"space-y-1.5\">{posts.map((p, i) => <PostCard key={p.id || i} post={p} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\n\ninterface GenericFormatterProps {\n data: unknown;\n}\n\nexport function GenericFormatter({ data }: GenericFormatterProps) {\n if (data === null || data === undefined) {\n return (\n <p className=\"text-sm text-muted-foreground italic\">No data returned</p>\n );\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { getFormatterType, type FormatterType } from \"./utils.js\";\nimport { CollapsibleResult } from \"./collapsible-result.js\";\nimport { getSummary, type SummaryResult } from \"./summaries.js\";\nimport { normalizeMicrosoftMail, normalizeMicrosoftCalendar, normalizeMicrosoftDrive } from \"./normalizers.js\";\nimport { EmailFormatter } from \"./formatters/email.js\";\nimport { CalendarEventFormatter } from \"./formatters/calendar-event.js\";\nimport { SlackMessageFormatter } from \"./formatters/slack-message.js\";\nimport { GithubFormatter } from \"./formatters/github.js\";\nimport { DriveFileFormatter } from \"./formatters/drive-file.js\";\nimport { SearchFormatter } from \"./formatters/search.js\";\nimport { DocsFormatter } from \"./formatters/docs.js\";\nimport { SheetsFormatter } from \"./formatters/sheets.js\";\nimport { SlidesFormatter } from \"./formatters/slides.js\";\nimport { HubspotFormatter } from \"./formatters/hubspot.js\";\nimport { LinearFormatter } from \"./formatters/linear.js\";\nimport { PipedriveFormatter } from \"./formatters/pipedrive.js\";\nimport { ComputeFormatter } from \"./formatters/compute.js\";\nimport { ResendFormatter } from \"./formatters/resend.js\";\nimport { InboxFormatter } from \"./formatters/inbox.js\";\nimport { DiscordFormatter } from \"./formatters/discord.js\";\nimport { NotionFormatter } from \"./formatters/notion.js\";\nimport { TwitterFormatter } from \"./formatters/twitter.js\";\nimport { TelegramFormatter } from \"./formatters/telegram.js\";\nimport { StripeFormatter } from \"./formatters/stripe.js\";\nimport { JiraFormatter } from \"./formatters/jira.js\";\nimport { SalesforceFormatter } from \"./formatters/salesforce.js\";\nimport { BrevoFormatter } from \"./formatters/brevo.js\";\nimport { CalendlyFormatter } from \"./formatters/calendly.js\";\nimport { TwilioFormatter } from \"./formatters/twilio.js\";\nimport { LinkedInFormatter } from \"./formatters/linkedin.js\";\nimport { GenericFormatter } from \"./formatters/generic.js\";\n\nexport interface ToolResultPart {\n type: string;\n // AI SDK v4+ (tool-{name} or dynamic-tool)\n toolName?: string;\n state?: string;\n output?: unknown;\n input?: unknown;\n // AI SDK v3 (tool-invocation)\n toolInvocation?: {\n toolName: string;\n state: string;\n result?: unknown;\n args?: Record<string, unknown>;\n };\n // Legacy v4 fields\n result?: unknown;\n args?: Record<string, unknown>;\n}\n\ninterface SupyagentToolResultProps {\n part: ToolResultPart;\n}\n\n/**\n * Extract the tool name from a part.\n */\nexport function extractToolName(part: ToolResultPart): string {\n if (part.type.startsWith(\"tool-\") && part.type !== \"tool-invocation\") {\n return part.type.slice(5);\n }\n if (part.type === \"dynamic-tool\" && part.toolName) {\n return part.toolName;\n }\n if (part.toolName) return part.toolName;\n if (part.toolInvocation?.toolName) return part.toolInvocation.toolName;\n return \"unknown\";\n}\n\nexport function extractState(part: ToolResultPart): string | undefined {\n return part.state ?? part.toolInvocation?.state;\n}\n\n/**\n * Unwrap supyagent's `{ok, data}` envelope so formatters see the inner payload.\n */\nexport function unwrapSupyagentResult(result: unknown): unknown {\n if (\n typeof result === \"object\" &&\n result !== null &&\n \"ok\" in result &&\n \"data\" in result\n ) {\n return (result as Record<string, unknown>).data;\n }\n return result;\n}\n\nexport function extractArgs(part: ToolResultPart): Record<string, unknown> | undefined {\n if (part.input && typeof part.input === \"object\" && !Array.isArray(part.input)) {\n return part.input as Record<string, unknown>;\n }\n if (part.args) return part.args;\n return part.toolInvocation?.args;\n}\n\nexport function extractResult(part: ToolResultPart): unknown {\n let raw: unknown;\n // v4+: output field\n if (\"output\" in part && part.output !== undefined) raw = part.output;\n // Legacy: result field\n else if (\"result\" in part && part.result !== undefined) raw = part.result;\n // v3: toolInvocation.result\n else raw = part.toolInvocation?.result;\n\n return unwrapSupyagentResult(raw);\n}\n\n/**\n * Apply Microsoft data normalization when the formatter type came from a Microsoft tool prefix.\n */\nexport function maybeNormalize(toolName: string, formatterType: FormatterType, data: unknown): unknown {\n const lower = toolName.toLowerCase();\n const isMicrosoft = lower.startsWith(\"microsoft_\") || lower.startsWith(\"outlook_\") || lower.startsWith(\"onedrive_\");\n if (!isMicrosoft) return data;\n\n switch (formatterType) {\n case \"email\":\n return normalizeMicrosoftMail(data);\n case \"calendar\":\n return normalizeMicrosoftCalendar(data);\n case \"drive\":\n return normalizeMicrosoftDrive(data);\n default:\n return data;\n }\n}\n\nexport function renderFormatter(formatterType: FormatterType, data: unknown): React.ReactNode {\n switch (formatterType) {\n case \"email\":\n return <EmailFormatter data={data} />;\n case \"calendar\":\n return <CalendarEventFormatter data={data} />;\n case \"slack\":\n return <SlackMessageFormatter data={data} />;\n case \"github\":\n return <GithubFormatter data={data} />;\n case \"drive\":\n return <DriveFileFormatter data={data} />;\n case \"search\":\n return <SearchFormatter data={data} />;\n case \"docs\":\n return <DocsFormatter data={data} />;\n case \"sheets\":\n return <SheetsFormatter data={data} />;\n case \"slides\":\n return <SlidesFormatter data={data} />;\n case \"hubspot\":\n return <HubspotFormatter data={data} />;\n case \"linear\":\n return <LinearFormatter data={data} />;\n case \"pipedrive\":\n return <PipedriveFormatter data={data} />;\n case \"compute\":\n return <ComputeFormatter data={data} />;\n case \"resend\":\n return <ResendFormatter data={data} />;\n case \"inbox\":\n return <InboxFormatter data={data} />;\n case \"discord\":\n return <DiscordFormatter data={data} />;\n case \"notion\":\n return <NotionFormatter data={data} />;\n case \"twitter\":\n return <TwitterFormatter data={data} />;\n case \"telegram\":\n return <TelegramFormatter data={data} />;\n case \"stripe\":\n return <StripeFormatter data={data} />;\n case \"jira\":\n return <JiraFormatter data={data} />;\n case \"salesforce\":\n return <SalesforceFormatter data={data} />;\n case \"brevo\":\n return <BrevoFormatter data={data} />;\n case \"calendly\":\n return <CalendlyFormatter data={data} />;\n case \"twilio\":\n return <TwilioFormatter data={data} />;\n case \"linkedin\":\n return <LinkedInFormatter data={data} />;\n default:\n return <GenericFormatter data={data} />;\n }\n}\n\nexport function SupyagentToolResult({ part }: SupyagentToolResultProps) {\n const state = extractState(part);\n const result = extractResult(part);\n const toolName = extractToolName(part);\n\n // Only render when we have a result\n if (state !== \"output-available\" || result === undefined) {\n return null;\n }\n\n const formatterType = getFormatterType(toolName);\n const data = maybeNormalize(toolName, formatterType, result);\n const summary: SummaryResult = getSummary(formatterType, data, toolName);\n\n return (\n <CollapsibleResult\n toolName={toolName}\n summary={summary.text}\n badge={summary.badge}\n >\n {renderFormatter(formatterType, data)}\n </CollapsibleResult>\n );\n}\n","import React from \"react\";\n\ninterface ToolInputProps {\n args: Record<string, unknown> | undefined;\n}\n\nfunction formatValue(value: unknown): { text: string; muted?: boolean } {\n if (value === null || value === undefined) {\n return { text: \"null\", muted: true };\n }\n if (typeof value === \"boolean\") {\n return { text: String(value), muted: true };\n }\n if (typeof value === \"number\") {\n return { text: String(value) };\n }\n if (typeof value === \"string\") {\n return { text: value };\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return { text: \"[]\", muted: true };\n // Simple arrays (primitives only): comma-join\n const allPrimitive = value.every(\n (v) => typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\",\n );\n if (allPrimitive) {\n const joined = value.join(\", \");\n return { text: joined.length > 80 ? joined.slice(0, 77) + \"...\" : joined };\n }\n return { text: `${value.length} items`, muted: true };\n }\n if (typeof value === \"object\") {\n const json = JSON.stringify(value);\n if (json.length <= 60) return { text: json, muted: true };\n return { text: json.slice(0, 57) + \"...\", muted: true };\n }\n return { text: String(value) };\n}\n\nexport function ToolInput({ args }: ToolInputProps) {\n if (!args || Object.keys(args).length === 0) return null;\n\n return (\n <div className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm\">\n {Object.entries(args).map(([key, value]) => {\n const formatted = formatValue(value);\n return (\n <React.Fragment key={key}>\n <span className=\"text-muted-foreground select-none\">{key}</span>\n <span className={formatted.muted ? \"text-muted-foreground\" : \"text-foreground\"}>\n {formatted.text}\n </span>\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight, Check, AlertCircle, Loader2 } from \"lucide-react\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport { humanizeToolName, getProviderLabel, getProviderFromToolName, getFormatterType } from \"./utils.js\";\nimport { getSummary, type SummaryResult } from \"./summaries.js\";\nimport {\n type ToolResultPart,\n extractToolName,\n extractState,\n extractArgs,\n extractResult,\n maybeNormalize,\n renderFormatter,\n} from \"./tool-result.js\";\nimport { ToolInput } from \"./tool-input.js\";\n\ninterface SupyagentToolActionProps {\n part: ToolResultPart;\n defaultExpanded?: boolean;\n}\n\nconst BADGE_STYLES: Record<string, string> = {\n default: \"bg-muted text-muted-foreground\",\n success: \"bg-green-500/10 text-green-500\",\n error: \"bg-destructive/10 text-destructive\",\n warning: \"bg-yellow-500/10 text-yellow-600\",\n};\n\nexport function SupyagentToolAction({ part, defaultExpanded = false }: SupyagentToolActionProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const toolName = extractToolName(part);\n const state = extractState(part);\n const args = extractArgs(part);\n\n const provider = getProviderFromToolName(toolName);\n const providerLabel = getProviderLabel(provider);\n const actionLabel = humanizeToolName(toolName);\n\n // Support both legacy state names and AI SDK v6 state names\n const isStreaming = state === \"input-streaming\" || state === \"partial-call\" || state === \"call\";\n const isError = state === \"output-error\" || state === \"error\";\n const isDone = state === \"output-available\" || state === \"result\";\n const hasResult = isDone || isError;\n\n // Compute summary and formatter output when result is available\n let summary: SummaryResult | undefined;\n let formatterOutput: React.ReactNode | undefined;\n\n if (hasResult) {\n const result = extractResult(part);\n if (result !== undefined) {\n const formatterType = getFormatterType(toolName);\n const data = maybeNormalize(toolName, formatterType, result);\n summary = getSummary(formatterType, data, toolName);\n formatterOutput = renderFormatter(formatterType, data);\n }\n }\n\n // Determine if there's content to expand\n const hasArgs = args && Object.keys(args).length > 0;\n const hasExpandableContent = hasArgs || formatterOutput;\n const canExpand = !isStreaming && hasExpandableContent;\n\n return (\n <div\n className=\"rounded-lg border border-border bg-card overflow-hidden\"\n data-state={isDone ? \"done\" : isError ? \"error\" : isStreaming ? \"streaming\" : \"pending\"}\n >\n {/* Header bar */}\n <button\n type=\"button\"\n onClick={() => canExpand && setExpanded(!expanded)}\n className={`flex items-center gap-2 w-full px-3 py-2 text-left transition-colors ${\n canExpand ? \"hover:bg-muted cursor-pointer\" : \"cursor-default\"\n }`}\n >\n <div className=\"relative shrink-0\">\n <ProviderIcon toolName={toolName} className=\"h-4 w-4 text-muted-foreground\" />\n {isStreaming && (\n <Loader2 className=\"absolute -top-1 -right-1 h-3 w-3 text-primary animate-spin\" />\n )}\n </div>\n\n <span className=\"text-xs text-muted-foreground\">{providerLabel}</span>\n <span className=\"text-sm text-foreground\">{actionLabel}</span>\n\n {/* Summary text (when result available) */}\n {summary && (\n <>\n <span className=\"text-muted-foreground text-xs\">·</span>\n <span className=\"text-sm text-muted-foreground flex-1 truncate\">{summary.text}</span>\n </>\n )}\n {!summary && <span className=\"flex-1\" />}\n\n {/* Badge */}\n {summary?.badge && (\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium shrink-0 ${\n BADGE_STYLES[summary.badge.variant || \"default\"]\n }`}\n >\n {summary.badge.text}\n </span>\n )}\n\n {/* Status indicator */}\n {isDone && (\n <Check className=\"h-3.5 w-3.5 text-green-500 shrink-0\" />\n )}\n {isError && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive shrink-0\">\n <AlertCircle className=\"h-3 w-3\" />\n Error\n </span>\n )}\n {isStreaming && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary animate-pulse shrink-0\">\n Calling...\n </span>\n )}\n\n {/* Chevron */}\n {canExpand && (\n expanded\n ? <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n : <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n )}\n </button>\n\n {/* Expandable body */}\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n style={{ gridTemplateRows: expanded ? \"1fr\" : \"0fr\" }}\n >\n <div className=\"overflow-hidden\">\n <div className=\"border-t border-border px-3 py-2 space-y-3\">\n {/* Input section */}\n {args && Object.keys(args).length > 0 && (\n <div>\n <p className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-1.5\">\n Input\n </p>\n <ToolInput args={args} />\n </div>\n )}\n\n {/* Output section */}\n {formatterOutput && (\n <div>\n <p className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-1.5\">\n Output\n </p>\n {formatterOutput}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight, Check, AlertCircle, Loader2 } from \"lucide-react\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport { humanizeToolName, getProviderLabel, getProviderFromToolName } from \"./utils.js\";\n\ninterface ToolCallPart {\n type: string;\n // AI SDK v4+ (tool-{name} or dynamic-tool)\n toolName?: string;\n toolCallId?: string;\n state?: string;\n input?: Record<string, unknown>;\n output?: unknown;\n // AI SDK v3 (tool-invocation)\n toolInvocation?: {\n toolName: string;\n state: string;\n args?: Record<string, unknown>;\n result?: unknown;\n };\n // Legacy v4 fields\n args?: Record<string, unknown>;\n}\n\ninterface SupyagentToolCallProps {\n part: ToolCallPart;\n}\n\n/**\n * Extract the tool name from a part.\n * Handles: tool-{name} type, dynamic-tool with toolName, legacy tool-invocation, direct toolName.\n */\nfunction extractToolName(part: ToolCallPart): string {\n // AI SDK v4+: type is \"tool-{name}\"\n if (part.type.startsWith(\"tool-\") && part.type !== \"tool-invocation\") {\n return part.type.slice(5); // strip \"tool-\" prefix\n }\n // Dynamic tool\n if (part.type === \"dynamic-tool\" && part.toolName) {\n return part.toolName;\n }\n // Direct toolName field\n if (part.toolName) return part.toolName;\n // Legacy v3\n if (part.toolInvocation?.toolName) return part.toolInvocation.toolName;\n return \"unknown\";\n}\n\nfunction extractState(part: ToolCallPart): string {\n return part.state || part.toolInvocation?.state || \"input-available\";\n}\n\nfunction extractArgs(part: ToolCallPart): Record<string, unknown> | undefined {\n return part.input || part.args || part.toolInvocation?.args;\n}\n\nexport function SupyagentToolCall({ part }: SupyagentToolCallProps) {\n const [expanded, setExpanded] = useState(false);\n\n const toolName = extractToolName(part);\n const state = extractState(part);\n const args = extractArgs(part);\n\n const provider = getProviderFromToolName(toolName);\n const providerLabel = getProviderLabel(provider);\n const actionLabel = humanizeToolName(toolName);\n\n const isStreaming = state === \"input-streaming\";\n const isError = state === \"output-error\";\n const isDone = state === \"output-available\";\n\n return (\n <div\n className=\"rounded-lg border border-border bg-card overflow-hidden\"\n data-state={isDone ? \"done\" : isError ? \"error\" : isStreaming ? \"streaming\" : \"pending\"}\n >\n <button\n type=\"button\"\n onClick={() => args && setExpanded(!expanded)}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-muted transition-colors\"\n >\n <div className=\"relative\">\n <ProviderIcon toolName={toolName} className=\"h-4 w-4 text-muted-foreground\" />\n {isStreaming && (\n <Loader2 className=\"absolute -top-1 -right-1 h-3 w-3 text-primary animate-spin\" />\n )}\n </div>\n\n <span className=\"text-xs text-muted-foreground\">{providerLabel}</span>\n <span className=\"text-sm text-foreground flex-1\">{actionLabel}</span>\n\n {isDone && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-green-500/10 px-2 py-0.5 text-xs text-green-500\">\n <Check className=\"h-3 w-3\" />\n Completed\n </span>\n )}\n {isError && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive\">\n <AlertCircle className=\"h-3 w-3\" />\n Error\n </span>\n )}\n {isStreaming && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary animate-pulse\">\n Calling...\n </span>\n )}\n\n {args && (\n expanded\n ? <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n : <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </button>\n\n {expanded && args && (\n <div className=\"border-t border-border px-3 py-2\">\n <pre className=\"text-xs text-muted-foreground overflow-x-auto\">\n {JSON.stringify(args, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["import_lucide_react","import_jsx_runtime","n","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","formatRelativeDate","import_lucide_react","import_jsx_runtime","UsersIcon","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","formatCurrency","DealCard","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","formatRecipients","import_lucide_react","import_jsx_runtime","formatTimestamp","EventCard","import_lucide_react","import_jsx_runtime","formatRelativeDate","ChannelCard","import_lucide_react","import_jsx_runtime","formatRelativeDate","import_lucide_react","import_jsx_runtime","formatRelativeDate","import_lucide_react","import_jsx_runtime","MessageCard","import_lucide_react","import_jsx_runtime","formatUnixDate","import_lucide_react","import_jsx_runtime","IssueCard","ProjectCard","import_lucide_react","import_jsx_runtime","ContactCard","import_lucide_react","import_jsx_runtime","STATUS_STYLES","ContactCard","import_lucide_react","import_jsx_runtime","STATUS_STYLES","EventCard","import_lucide_react","import_jsx_runtime","formatRelativeDate","STATUS_STYLES","MessageCard","import_lucide_react","import_jsx_runtime","formatRelativeDate","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_lucide_react","import_jsx_runtime","BADGE_STYLES","import_react","import_lucide_react","import_jsx_runtime","extractToolName","extractState","extractArgs"]}
|
|
1
|
+
{"version":3,"sources":["../src/react.tsx","../src/ui/utils.ts","../src/ui/collapsible-result.tsx","../src/ui/provider-icon.tsx","../src/ui/summaries.ts","../src/ui/normalizers.ts","../src/ui/formatters/email.tsx","../src/ui/formatters/calendar-event.tsx","../src/ui/formatters/slack-message.tsx","../src/ui/formatters/github.tsx","../src/ui/formatters/drive-file.tsx","../src/ui/formatters/search.tsx","../src/ui/formatters/docs.tsx","../src/ui/formatters/sheets.tsx","../src/ui/formatters/slides.tsx","../src/ui/formatters/hubspot.tsx","../src/ui/formatters/linear.tsx","../src/ui/formatters/pipedrive.tsx","../src/ui/formatters/compute.tsx","../src/ui/formatters/resend.tsx","../src/ui/formatters/inbox.tsx","../src/ui/formatters/discord.tsx","../src/ui/formatters/notion.tsx","../src/ui/formatters/twitter.tsx","../src/ui/formatters/telegram.tsx","../src/ui/formatters/stripe.tsx","../src/ui/formatters/jira.tsx","../src/ui/formatters/salesforce.tsx","../src/ui/formatters/brevo.tsx","../src/ui/formatters/calendly.tsx","../src/ui/formatters/twilio.tsx","../src/ui/formatters/linkedin.tsx","../src/ui/formatters/generic.tsx","../src/ui/tool-result.tsx","../src/ui/tool-input.tsx","../src/ui/tool-action.tsx","../src/ui/tool-call.tsx"],"sourcesContent":["// ── Data extraction utilities (used by tool-message.tsx) ─────────────────────\nexport {\n extractToolName,\n extractState,\n extractResult,\n extractArgs,\n unwrapSupyagentResult,\n maybeNormalize,\n} from \"./ui/tool-result.js\";\nexport type { ToolResultPart } from \"./ui/tool-result.js\";\n\n// ── Mapping & labels ─────────────────────────────────────────────────────────\nexport {\n getFormatterType,\n getProviderFromToolName,\n humanizeToolName,\n getProviderLabel,\n resolveToolName,\n PROVIDER_LABELS,\n} from \"./ui/utils.js\";\nexport type { FormatterType } from \"./ui/utils.js\";\n\n// ── Summaries ────────────────────────────────────────────────────────────────\nexport { getSummary } from \"./ui/summaries.js\";\nexport type { SummaryResult } from \"./ui/summaries.js\";\n\n// ── Icon component ───────────────────────────────────────────────────────────\nexport { ProviderIcon } from \"./ui/provider-icon.js\";\n\n// ── Input renderer ───────────────────────────────────────────────────────────\nexport { ToolInput } from \"./ui/tool-input.js\";\n\n// ── Normalizers (Microsoft data) ─────────────────────────────────────────────\nexport {\n normalizeMicrosoftMail,\n normalizeMicrosoftCalendar,\n normalizeMicrosoftDrive,\n} from \"./ui/normalizers.js\";\n\n// ── DEPRECATED — kept for backwards compat, will be removed in next major ───\nexport { SupyagentToolAction } from \"./ui/tool-action.js\";\nexport { SupyagentToolResult } from \"./ui/tool-result.js\";\nexport { SupyagentToolCall } from \"./ui/tool-call.js\";\nexport { CollapsibleResult } from \"./ui/collapsible-result.js\";\nexport type { CollapsibleResultProps } from \"./ui/collapsible-result.js\";\n\n// Individual formatters (deprecated — use local tool renderers instead)\nexport { EmailFormatter } from \"./ui/formatters/email.js\";\nexport { CalendarEventFormatter } from \"./ui/formatters/calendar-event.js\";\nexport { SlackMessageFormatter } from \"./ui/formatters/slack-message.js\";\nexport { GithubFormatter } from \"./ui/formatters/github.js\";\nexport { DriveFileFormatter } from \"./ui/formatters/drive-file.js\";\nexport { SearchFormatter } from \"./ui/formatters/search.js\";\nexport { DocsFormatter } from \"./ui/formatters/docs.js\";\nexport { SheetsFormatter } from \"./ui/formatters/sheets.js\";\nexport { SlidesFormatter } from \"./ui/formatters/slides.js\";\nexport { HubspotFormatter } from \"./ui/formatters/hubspot.js\";\nexport { LinearFormatter } from \"./ui/formatters/linear.js\";\nexport { PipedriveFormatter } from \"./ui/formatters/pipedrive.js\";\nexport { ComputeFormatter } from \"./ui/formatters/compute.js\";\nexport { ResendFormatter } from \"./ui/formatters/resend.js\";\nexport { InboxFormatter } from \"./ui/formatters/inbox.js\";\nexport { GenericFormatter } from \"./ui/formatters/generic.js\";\nexport { DiscordFormatter } from \"./ui/formatters/discord.js\";\nexport { NotionFormatter } from \"./ui/formatters/notion.js\";\nexport { TwitterFormatter } from \"./ui/formatters/twitter.js\";\nexport { TelegramFormatter } from \"./ui/formatters/telegram.js\";\nexport { StripeFormatter } from \"./ui/formatters/stripe.js\";\nexport { JiraFormatter } from \"./ui/formatters/jira.js\";\nexport { SalesforceFormatter } from \"./ui/formatters/salesforce.js\";\nexport { BrevoFormatter } from \"./ui/formatters/brevo.js\";\nexport { CalendlyFormatter } from \"./ui/formatters/calendly.js\";\nexport { TwilioFormatter } from \"./ui/formatters/twilio.js\";\nexport { LinkedInFormatter } from \"./ui/formatters/linkedin.js\";\n","/**\n * Extract provider/service prefix from a tool name.\n * Tool names follow `{service}_{action}` convention.\n */\nexport function getProviderFromToolName(toolName: string): string {\n const idx = toolName.indexOf(\"_\");\n return idx > 0 ? toolName.slice(0, idx) : toolName;\n}\n\n/**\n * Convert a tool name like \"gmail_list_messages\" to \"List messages\".\n */\nexport function humanizeToolName(toolName: string): string {\n const idx = toolName.indexOf(\"_\");\n if (idx < 0) return toolName;\n const action = toolName.slice(idx + 1);\n const words = action.replace(/_/g, \" \");\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Provider display names.\n */\nexport const PROVIDER_LABELS: Record<string, string> = {\n gmail: \"Gmail\",\n calendar: \"Calendar\",\n drive: \"Drive\",\n slack: \"Slack\",\n github: \"GitHub\",\n discord: \"Discord\",\n notion: \"Notion\",\n hubspot: \"HubSpot\",\n linkedin: \"LinkedIn\",\n twitter: \"Twitter\",\n telegram: \"Telegram\",\n microsoft: \"Microsoft\",\n outlook: \"Outlook\",\n onedrive: \"OneDrive\",\n whatsapp: \"WhatsApp\",\n inbox: \"Inbox\",\n docs: \"Docs\",\n sheets: \"Sheets\",\n slides: \"Slides\",\n search: \"Search\",\n compute: \"Compute\",\n resend: \"Resend\",\n linear: \"Linear\",\n pipedrive: \"Pipedrive\",\n stripe: \"Stripe\",\n jira: \"Jira\",\n salesforce: \"Salesforce\",\n brevo: \"Brevo\",\n calendly: \"Calendly\",\n twilio: \"Twilio\",\n image: \"Image\",\n audio: \"Audio\",\n video: \"Video\",\n};\n\n/**\n * Get a display label for a provider.\n */\nexport function getProviderLabel(provider: string): string {\n return PROVIDER_LABELS[provider] || provider.charAt(0).toUpperCase() + provider.slice(1);\n}\n\n/**\n * Determine which formatter to use based on tool name prefix.\n */\nexport type FormatterType =\n | \"email\"\n | \"calendar\"\n | \"slack\"\n | \"github\"\n | \"drive\"\n | \"search\"\n | \"docs\"\n | \"sheets\"\n | \"slides\"\n | \"hubspot\"\n | \"linear\"\n | \"pipedrive\"\n | \"compute\"\n | \"resend\"\n | \"inbox\"\n | \"discord\"\n | \"notion\"\n | \"twitter\"\n | \"telegram\"\n | \"stripe\"\n | \"jira\"\n | \"salesforce\"\n | \"brevo\"\n | \"calendly\"\n | \"twilio\"\n | \"linkedin\"\n | \"bash\"\n | \"image\"\n | \"audio\"\n | \"video\"\n | \"generic\";\n\n/**\n * Microsoft tool name prefixes that map to existing Google formatters.\n */\nconst MICROSOFT_PREFIX_MAP: Array<[string, FormatterType]> = [\n [\"microsoft_mail_\", \"email\"],\n [\"microsoft_email_\", \"email\"],\n [\"outlook_\", \"email\"],\n [\"microsoft_calendar_\", \"calendar\"],\n [\"microsoft_drive_\", \"drive\"],\n [\"onedrive_\", \"drive\"],\n];\n\nexport function getFormatterType(toolName: string): FormatterType {\n // Check Microsoft full-name prefixes first\n const lower = toolName.toLowerCase();\n for (const [prefix, type] of MICROSOFT_PREFIX_MAP) {\n if (lower.startsWith(prefix)) return type;\n }\n\n const provider = getProviderFromToolName(toolName);\n switch (provider) {\n case \"gmail\":\n return \"email\";\n case \"calendar\":\n return \"calendar\";\n case \"slack\":\n return \"slack\";\n case \"github\":\n return \"github\";\n case \"drive\":\n return \"drive\";\n case \"search\":\n return \"search\";\n case \"docs\":\n return \"docs\";\n case \"sheets\":\n return \"sheets\";\n case \"slides\":\n return \"slides\";\n case \"hubspot\":\n return \"hubspot\";\n case \"linear\":\n return \"linear\";\n case \"pipedrive\":\n return \"pipedrive\";\n case \"compute\":\n return \"compute\";\n case \"resend\":\n return \"resend\";\n case \"inbox\":\n return \"inbox\";\n case \"discord\":\n return \"discord\";\n case \"notion\":\n return \"notion\";\n case \"twitter\":\n return \"twitter\";\n case \"telegram\":\n return \"telegram\";\n case \"stripe\":\n return \"stripe\";\n case \"jira\":\n return \"jira\";\n case \"salesforce\":\n return \"salesforce\";\n case \"brevo\":\n return \"brevo\";\n case \"calendly\":\n return \"calendly\";\n case \"twilio\":\n return \"twilio\";\n case \"linkedin\":\n return \"linkedin\";\n case \"image\":\n return \"image\";\n case \"tts\":\n case \"stt\":\n return \"audio\";\n case \"video\":\n return \"video\";\n case \"code\":\n return \"compute\";\n case \"ocr\":\n return \"generic\";\n case \"bash\":\n case \"shell\":\n return \"bash\";\n default:\n return \"generic\";\n }\n}\n\n/**\n * Resolve a virtual tool name for rendering purposes.\n * For `apiCall`, derives the tool name from the API path in args.\n * For all other tools, returns the raw name unchanged.\n */\nexport function resolveToolName(\n rawToolName: string,\n args?: Record<string, unknown>\n): string {\n if (rawToolName !== \"apiCall\" || !args) return rawToolName;\n\n const path = typeof args.path === \"string\" ? args.path : \"\";\n // Strip /api/v1/ prefix, join remaining segments with _\n const stripped = path.replace(/^\\/api\\/v1\\//, \"\");\n if (!stripped || stripped === path) return rawToolName; // no match, keep apiCall\n\n // Convert path segments to underscore-separated tool name\n // e.g. \"gmail/messages\" → \"gmail_messages\"\n // e.g. \"microsoft/mail/messages\" → \"microsoft_mail_messages\"\n return stripped.split(\"/\").filter(Boolean).join(\"_\");\n}\n","import React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport { getProviderLabel, getProviderFromToolName } from \"./utils.js\";\n\ninterface BadgeProps {\n text: string;\n variant?: \"default\" | \"success\" | \"error\" | \"warning\";\n}\n\nexport interface CollapsibleResultProps {\n toolName: string;\n summary: string;\n badge?: BadgeProps;\n defaultExpanded?: boolean;\n children: React.ReactNode;\n}\n\nconst BADGE_STYLES: Record<string, string> = {\n default: \"bg-muted text-muted-foreground\",\n success: \"bg-green-500/10 text-green-500\",\n error: \"bg-destructive/10 text-destructive\",\n warning: \"bg-yellow-500/10 text-yellow-600\",\n};\n\nexport function CollapsibleResult({\n toolName,\n summary,\n badge,\n defaultExpanded = false,\n children,\n}: CollapsibleResultProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const provider = getProviderFromToolName(toolName);\n const providerLabel = getProviderLabel(provider);\n\n return (\n <div className=\"rounded-lg border border-border bg-card overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-muted transition-colors\"\n >\n <ProviderIcon toolName={toolName} className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">{providerLabel}</span>\n <span className=\"text-sm text-foreground flex-1 truncate\">{summary}</span>\n\n {badge && (\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${\n BADGE_STYLES[badge.variant || \"default\"]\n }`}\n >\n {badge.text}\n </span>\n )}\n\n {expanded ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n )}\n </button>\n\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n style={{ gridTemplateRows: expanded ? \"1fr\" : \"0fr\" }}\n >\n <div className=\"overflow-hidden\">\n <div className=\"border-t border-border px-3 py-2\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n","import React from \"react\";\nimport {\n Mail,\n Calendar,\n HardDrive,\n MessageSquare,\n Github,\n type LucideIcon,\n Wrench,\n Bell,\n FileText,\n Table2,\n Presentation,\n Search,\n Terminal,\n Send,\n CircleDot,\n Briefcase,\n Users,\n CreditCard,\n SquareKanban,\n Cloud,\n CalendarClock,\n Phone,\n MessageCircle,\n UserCircle,\n Monitor,\n} from \"lucide-react\";\nimport { getProviderFromToolName } from \"./utils.js\";\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n gmail: Mail,\n calendar: Calendar,\n drive: HardDrive,\n slack: MessageSquare,\n github: Github,\n discord: MessageSquare,\n notion: FileText,\n inbox: Bell,\n docs: FileText,\n sheets: Table2,\n slides: Presentation,\n search: Search,\n compute: Terminal,\n resend: Send,\n linear: CircleDot,\n pipedrive: Briefcase,\n hubspot: Users,\n stripe: CreditCard,\n jira: SquareKanban,\n salesforce: Cloud,\n brevo: Send,\n calendly: CalendarClock,\n twilio: Phone,\n twitter: MessageCircle,\n linkedin: UserCircle,\n microsoft: Monitor,\n outlook: Mail,\n onedrive: HardDrive,\n telegram: Send,\n};\n\ninterface ProviderIconProps {\n toolName: string;\n className?: string;\n}\n\nexport function ProviderIcon({ toolName, className = \"h-4 w-4\" }: ProviderIconProps) {\n const provider = getProviderFromToolName(toolName);\n const Icon = ICON_MAP[provider] || Wrench;\n return <Icon className={className} />;\n}\n","import { humanizeToolName } from \"./utils.js\";\n\nexport interface SummaryResult {\n text: string;\n badge?: { text: string; variant?: \"default\" | \"success\" | \"error\" | \"warning\" };\n}\n\nfunction countItems(data: unknown, ...keys: string[]): number {\n if (Array.isArray(data)) return data.length;\n if (typeof data === \"object\" && data !== null) {\n for (const key of keys) {\n const val = (data as Record<string, unknown>)[key];\n if (Array.isArray(val)) return val.length;\n }\n }\n return 0;\n}\n\nfunction actionFromToolName(toolName: string): string {\n const lower = toolName.toLowerCase();\n if (lower.includes(\"send\") || lower.includes(\"create\") || lower.includes(\"post\")) return \"send\";\n if (lower.includes(\"list\") || lower.includes(\"search\") || lower.includes(\"fetch\") || lower.includes(\"get_all\")) return \"list\";\n return \"get\";\n}\n\nfunction countBadge(n: number): SummaryResult[\"badge\"] | undefined {\n return n > 0 ? { text: String(n), variant: \"default\" } : undefined;\n}\n\nexport function getEmailSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const to = typeof data === \"object\" && data !== null && \"to\" in data\n ? String((data as any).to) : undefined;\n return { text: to ? `Sent email to ${to}` : \"Sent email\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\");\n if (n > 0) return { text: `Listed ${n} emails`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"subject\" in data) {\n return { text: `Email: ${(data as any).subject}` };\n }\n return { text: \"Email result\" };\n}\n\nexport function getCalendarSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const summary = typeof data === \"object\" && data !== null && \"summary\" in data\n ? String((data as any).summary) : undefined;\n return { text: summary ? `Created event: ${summary}` : \"Created event\", badge: { text: \"Created\", variant: \"success\" } };\n }\n const n = countItems(data, \"events\", \"items\");\n if (n > 0) return { text: `Listed ${n} events`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"summary\" in data) {\n return { text: String((data as any).summary) };\n }\n return { text: \"Calendar result\" };\n}\n\nexport function getSlackSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n // Channel list\n if (typeof data === \"object\" && data !== null && \"channels\" in data) {\n const n = Array.isArray((data as any).channels) ? (data as any).channels.length : 0;\n return { text: `Listed ${n} channels`, badge: countBadge(n) };\n }\n if (action === \"send\") {\n const ch = typeof data === \"object\" && data !== null && \"channel\" in data\n ? String((data as any).channel) : undefined;\n return { text: ch ? `Sent message to #${ch}` : \"Sent message\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\");\n if (n > 0) {\n const ch = typeof data === \"object\" && data !== null && \"channel\" in data\n ? String((data as any).channel) : undefined;\n return { text: ch ? `${n} messages in #${ch}` : `${n} messages`, badge: countBadge(n) };\n }\n return { text: \"Slack result\" };\n}\n\nexport function getGithubSummary(data: unknown, toolName: string): SummaryResult {\n const n = countItems(data);\n if (n > 0) {\n const isPR = toolName.toLowerCase().includes(\"pull\") || toolName.toLowerCase().includes(\"pr\");\n return { text: isPR ? `Listed ${n} pull requests` : `Listed ${n} issues`, badge: countBadge(n) };\n }\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n const num = \"number\" in data ? ` #${(data as any).number}` : \"\";\n return { text: `${(data as any).title}${num}` };\n }\n return { text: \"GitHub result\" };\n}\n\nexport function getDriveSummary(data: unknown, toolName: string): SummaryResult {\n const n = countItems(data, \"files\");\n if (n > 0) return { text: `Listed ${n} files`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"name\" in data) {\n return { text: String((data as any).name) };\n }\n return { text: \"Drive result\" };\n}\n\nexport function getSearchSummary(data: unknown): SummaryResult {\n let n = 0;\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.results)) n = d.results.length;\n else if (Array.isArray(d.organic)) n = d.organic.length;\n }\n if (n > 0) return { text: `Found ${n} results`, badge: countBadge(n) };\n return { text: \"Search result\" };\n}\n\nexport function getDocsSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n return { text: `Document: ${(data as any).title}` };\n }\n return { text: \"Document result\" };\n}\n\nexport function getSheetsSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (d.updatedCells) return { text: `Updated ${d.updatedCells} cells`, badge: countBadge(Number(d.updatedCells)) };\n if (d.title) return { text: `Spreadsheet: ${d.title}` };\n }\n return { text: \"Sheets result\" };\n}\n\nexport function getSlidesSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n const slideCount = Array.isArray(d.slides) ? d.slides.length : undefined;\n if (d.title) {\n return { text: `Presentation: ${d.title}`, badge: slideCount ? countBadge(slideCount) : undefined };\n }\n }\n return { text: \"Slides result\" };\n}\n\nexport function getHubspotSummary(data: unknown, toolName: string): SummaryResult {\n const tl = toolName.toLowerCase();\n const isDeal = tl.includes(\"deal\");\n const isCompany = tl.includes(\"compan\");\n const n = countItems(data, \"results\", \"contacts\", \"companies\", \"deals\");\n if (n > 0) {\n const label = isDeal ? \"deals\" : isCompany ? \"companies\" : \"contacts\";\n return { text: `Listed ${n} ${label}`, badge: countBadge(n) };\n }\n if (isDeal) return { text: \"Deal result\" };\n return { text: isCompany ? \"Company result\" : \"Contact result\" };\n}\n\nexport function getLinearSummary(data: unknown, toolName: string): SummaryResult {\n const n = countItems(data, \"nodes\", \"issues\", \"projects\");\n if (n > 0) return { text: `Listed ${n} issues`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"identifier\" in data && \"title\" in data) {\n return { text: `${(data as any).identifier} ${(data as any).title}` };\n }\n return { text: \"Linear result\" };\n}\n\nexport function getPipedriveSummary(data: unknown): SummaryResult {\n const n = countItems(data, \"data\");\n if (n > 0) return { text: `Listed ${n} deals`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n return { text: String((data as any).title) };\n }\n return { text: \"Pipedrive result\" };\n}\n\nexport function getComputeSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n const exitCode = (d.exit_code ?? d.exitCode) as number | undefined;\n if (exitCode !== undefined && exitCode !== 0) {\n return { text: \"Execution failed\", badge: { text: `exit ${exitCode}`, variant: \"error\" } };\n }\n return { text: \"Execution completed\", badge: exitCode !== undefined ? { text: `exit ${exitCode}`, variant: \"success\" } : undefined };\n }\n return { text: \"Compute result\" };\n}\n\nexport function getResendSummary(data: unknown): SummaryResult {\n const d = typeof data === \"object\" && data !== null && \"data\" in data ? (data as any).data : data;\n if (typeof d === \"object\" && d !== null && \"to\" in d) {\n const to = Array.isArray(d.to) ? d.to.join(\", \") : String(d.to);\n return { text: `Sent email to ${to}`, badge: { text: \"Sent\", variant: \"success\" } };\n }\n return { text: \"Email sent\", badge: { text: \"Sent\", variant: \"success\" } };\n}\n\nexport function getInboxSummary(data: unknown): SummaryResult {\n const n = countItems(data, \"events\");\n if (n > 0) return { text: `Listed ${n} notifications`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n return { text: String((data as any).title) };\n }\n return { text: \"Inbox result\" };\n}\n\nexport function getDiscordSummary(data: unknown, toolName: string): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.guilds)) return { text: `Listed ${d.guilds.length} servers`, badge: countBadge(d.guilds.length) };\n if (Array.isArray(d.channels)) return { text: `Listed ${d.channels.length} channels`, badge: countBadge(d.channels.length) };\n }\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const ch = typeof data === \"object\" && data !== null && \"channel\" in data\n ? `#${(data as any).channel}` : undefined;\n return { text: ch ? `Message in ${ch}` : \"Sent message\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\");\n if (n > 0) return { text: `Listed ${n} messages`, badge: countBadge(n) };\n return { text: \"Discord result\" };\n}\n\nexport function getNotionSummary(data: unknown, toolName: string): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.pages)) return { text: `Listed ${d.pages.length} pages`, badge: countBadge(d.pages.length) };\n if (Array.isArray(d.databases)) return { text: `Listed ${d.databases.length} databases`, badge: countBadge(d.databases.length) };\n if (Array.isArray(d.results)) {\n const n = d.results.length;\n const isDB = toolName.toLowerCase().includes(\"database\");\n return { text: isDB ? `Listed ${n} databases` : `Listed ${n} pages`, badge: countBadge(n) };\n }\n }\n if (typeof data === \"object\" && data !== null && \"title\" in data) {\n return { text: `Page: ${(data as any).title}` };\n }\n // Check for nested Notion title format\n if (typeof data === \"object\" && data !== null && \"properties\" in data) {\n return { text: \"Page result\" };\n }\n return { text: \"Notion result\" };\n}\n\nexport function getTwitterSummary(data: unknown): SummaryResult {\n const n = countItems(data, \"tweets\", \"data\");\n if (n > 0) return { text: `Listed ${n} tweets`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n const author = d.author_username || d.username;\n if (d.text && author) return { text: `Tweet by @${author}` };\n }\n return { text: \"Twitter result\" };\n}\n\nexport function getTelegramSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const chat = typeof data === \"object\" && data !== null && \"chat\" in data\n ? (data as any).chat?.title || (data as any).chat?.username\n : undefined;\n return { text: chat ? `Sent message to ${chat}` : \"Sent message\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\", \"result\");\n if (n > 0) return { text: `${n} messages`, badge: countBadge(n) };\n return { text: \"Telegram result\" };\n}\n\nexport function getStripeSummary(data: unknown, toolName: string): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n // Balance\n if (Array.isArray(d.available) || Array.isArray(d.pending)) {\n const amt = Array.isArray(d.available) && d.available.length > 0\n ? `${(d.available[0].amount / 100).toFixed(2)} ${String(d.available[0].currency).toUpperCase()}`\n : undefined;\n return { text: amt ? `Balance: ${amt}` : \"Balance\", badge: amt ? { text: amt, variant: \"default\" } : undefined };\n }\n if (Array.isArray(d.data)) {\n const n = d.data.length;\n const lower = toolName.toLowerCase();\n if (lower.includes(\"customer\")) return { text: `Listed ${n} customers`, badge: countBadge(n) };\n if (lower.includes(\"invoice\")) return { text: `Listed ${n} invoices`, badge: countBadge(n) };\n if (lower.includes(\"subscri\")) return { text: `Listed ${n} subscriptions`, badge: countBadge(n) };\n if (lower.includes(\"charge\") || lower.includes(\"payment\")) return { text: `Listed ${n} payments`, badge: countBadge(n) };\n return { text: `Listed ${n} items`, badge: countBadge(n) };\n }\n }\n return { text: \"Stripe result\" };\n}\n\nexport function getJiraSummary(data: unknown): SummaryResult {\n const n = countItems(data, \"issues\", \"projects\");\n if (n > 0) return { text: `Listed ${n} issues`, badge: countBadge(n) };\n if (typeof data === \"object\" && data !== null && \"key\" in data && \"fields\" in data) {\n const fields = (data as any).fields;\n return { text: `${(data as any).key}: ${fields?.summary || \"Issue\"}` };\n }\n return { text: \"Jira result\" };\n}\n\nexport function getSalesforceSummary(data: unknown, toolName: string): SummaryResult {\n const n = countItems(data, \"records\");\n const isOpp = toolName.toLowerCase().includes(\"opportunit\");\n if (n > 0) return { text: isOpp ? `Listed ${n} opportunities` : `Listed ${n} contacts`, badge: countBadge(n) };\n return { text: \"Salesforce result\" };\n}\n\nexport function getBrevoSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const to = typeof data === \"object\" && data !== null && \"to\" in data\n ? String((data as any).to) : undefined;\n return { text: to ? `Sent email to ${to}` : \"Sent email\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"contacts\", \"campaigns\");\n const isCampaign = toolName.toLowerCase().includes(\"campaign\");\n if (n > 0) return { text: isCampaign ? `Listed ${n} campaigns` : `Listed ${n} contacts`, badge: countBadge(n) };\n return { text: \"Brevo result\" };\n}\n\nexport function getCalendlySummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.collection)) {\n const n = d.collection.length;\n // Detect event types vs scheduled events\n const first = n > 0 ? (d.collection[0] as any) : null;\n const isType = first && (\"duration\" in first || \"slug\" in first);\n return { text: isType ? `Listed ${n} event types` : `Listed ${n} events`, badge: countBadge(n) };\n }\n if (Array.isArray(d.scheduled_events)) return { text: `Listed ${d.scheduled_events.length} events`, badge: countBadge(d.scheduled_events.length) };\n if (Array.isArray(d.event_types)) return { text: `Listed ${d.event_types.length} event types`, badge: countBadge(d.event_types.length) };\n }\n return { text: \"Calendly result\" };\n}\n\nexport function getTwilioSummary(data: unknown, toolName: string): SummaryResult {\n const action = actionFromToolName(toolName);\n if (action === \"send\") {\n const to = typeof data === \"object\" && data !== null && \"to\" in data\n ? String((data as any).to) : undefined;\n return { text: to ? `Sent SMS to ${to}` : \"Sent SMS\", badge: { text: \"Sent\", variant: \"success\" } };\n }\n const n = countItems(data, \"messages\");\n if (n > 0) return { text: `Listed ${n} messages`, badge: countBadge(n) };\n return { text: \"Twilio result\" };\n}\n\nexport function getLinkedinSummary(data: unknown): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (Array.isArray(d.posts) || Array.isArray(d.elements)) {\n const n = (d.posts as unknown[] || d.elements as unknown[]).length;\n return { text: `Listed ${n} posts`, badge: countBadge(n) };\n }\n if (d.localizedFirstName || d.firstName || d.name) {\n const name = d.name || [d.localizedFirstName, d.localizedLastName].filter(Boolean).join(\" \");\n return { text: `Profile: ${name}` };\n }\n }\n return { text: \"LinkedIn result\" };\n}\n\nexport function getImageSummary(data: unknown, toolName: string): SummaryResult {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (d.status === \"processing\" || d.poll_url) {\n return { text: \"Generating image...\", badge: { text: \"processing\", variant: \"warning\" } };\n }\n if (d.image_url) {\n return { text: \"Image generated\", badge: { text: \"done\", variant: \"success\" } };\n }\n }\n return { text: humanizeToolName(toolName) };\n}\n\nexport function getAudioSummary(data: unknown, toolName: string): SummaryResult {\n const isTTS = toolName.toLowerCase().startsWith(\"tts\");\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (d.status === \"processing\" || d.poll_url) {\n return {\n text: isTTS ? \"Generating audio...\" : \"Transcribing...\",\n badge: { text: \"processing\", variant: \"warning\" },\n };\n }\n if (d.audio_url) {\n return { text: \"Audio generated\", badge: { text: \"done\", variant: \"success\" } };\n }\n if (d.result && typeof d.result === \"object\" && \"text\" in (d.result as Record<string, unknown>)) {\n return { text: \"Transcription complete\", badge: { text: \"done\", variant: \"success\" } };\n }\n }\n return { text: isTTS ? \"Text-to-speech\" : \"Transcription\" };\n}\n\nexport function getVideoSummary(data: unknown, toolName: string): SummaryResult {\n const isUnderstand = toolName.toLowerCase().includes(\"understand\");\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n if (d.status === \"processing\" || d.poll_url) {\n return {\n text: isUnderstand ? \"Analyzing video...\" : \"Generating video...\",\n badge: { text: \"processing\", variant: \"warning\" },\n };\n }\n if (d.answer) {\n return { text: \"Video analysis complete\", badge: { text: \"done\", variant: \"success\" } };\n }\n if (d.result && typeof d.result === \"object\") {\n return { text: \"Video generated\", badge: { text: \"done\", variant: \"success\" } };\n }\n }\n return { text: isUnderstand ? \"Video analysis\" : \"Video generation\" };\n}\n\nexport function getBashSummary(data: unknown): SummaryResult {\n if (typeof data !== \"object\" || data === null) return { text: \"Command executed\" };\n const d = data as Record<string, unknown>;\n const exitCode = (d.exitCode ?? d.exit_code ?? 0) as number;\n const timedOut = d.timedOut ?? d.timed_out;\n if (timedOut) return { text: \"Command timed out\", badge: { text: \"timeout\", variant: \"warning\" } };\n if (exitCode === 0) return { text: \"Command succeeded\", badge: { text: \"exit 0\", variant: \"success\" } };\n return { text: `Command failed`, badge: { text: `exit ${exitCode}`, variant: \"error\" } };\n}\n\nexport function getGenericSummary(_data: unknown, toolName: string): SummaryResult {\n return { text: humanizeToolName(toolName) };\n}\n\nexport type SummaryFn = (data: unknown, toolName: string) => SummaryResult;\n\nexport const SUMMARY_MAP: Record<string, SummaryFn> = {\n email: getEmailSummary,\n calendar: getCalendarSummary,\n slack: getSlackSummary,\n github: getGithubSummary,\n drive: getDriveSummary,\n search: getSearchSummary,\n docs: getDocsSummary,\n sheets: getSheetsSummary,\n slides: getSlidesSummary,\n hubspot: getHubspotSummary,\n linear: getLinearSummary,\n pipedrive: getPipedriveSummary,\n compute: getComputeSummary,\n resend: getResendSummary,\n inbox: getInboxSummary,\n discord: getDiscordSummary,\n notion: getNotionSummary,\n twitter: getTwitterSummary,\n telegram: getTelegramSummary,\n stripe: getStripeSummary,\n jira: getJiraSummary,\n salesforce: getSalesforceSummary,\n brevo: getBrevoSummary,\n calendly: getCalendlySummary,\n twilio: getTwilioSummary,\n linkedin: getLinkedinSummary,\n image: getImageSummary,\n audio: getAudioSummary,\n video: getVideoSummary,\n bash: getBashSummary,\n generic: getGenericSummary,\n};\n\nexport function getSummary(formatterType: string, data: unknown, toolName: string): SummaryResult {\n const fn = SUMMARY_MAP[formatterType] || getGenericSummary;\n return fn(data, toolName);\n}\n","/**\n * Normalize Microsoft API responses to match the Google formatter data shapes.\n * This lets us reuse EmailFormatter, CalendarEventFormatter, and DriveFileFormatter.\n */\n\nfunction normalizeMailItem(msg: Record<string, unknown>): Record<string, unknown> {\n return {\n id: msg.id,\n subject: msg.subject,\n from: typeof msg.from === \"object\" && msg.from !== null\n ? (msg.from as any).emailAddress?.address || (msg.from as any).emailAddress?.name\n : msg.from,\n to: Array.isArray(msg.toRecipients)\n ? (msg.toRecipients as any[]).map((r) => r.emailAddress?.address || r.emailAddress?.name).join(\", \")\n : msg.to,\n date: msg.receivedDateTime || msg.createdDateTime || msg.date,\n snippet: msg.bodyPreview || msg.snippet,\n body: typeof msg.body === \"object\" && msg.body !== null ? (msg.body as any).content : msg.body,\n hasAttachments: msg.hasAttachments,\n };\n}\n\nfunction normalizeCalendarItem(evt: Record<string, unknown>): Record<string, unknown> {\n const start = typeof evt.start === \"object\" && evt.start !== null\n ? { dateTime: (evt.start as any).dateTime || (evt.start as any).date, timeZone: (evt.start as any).timeZone }\n : evt.start;\n const end = typeof evt.end === \"object\" && evt.end !== null\n ? { dateTime: (evt.end as any).dateTime || (evt.end as any).date, timeZone: (evt.end as any).timeZone }\n : evt.end;\n\n return {\n id: evt.id,\n summary: evt.subject || evt.summary,\n start,\n end,\n location: typeof evt.location === \"object\" && evt.location !== null\n ? (evt.location as any).displayName\n : evt.location,\n attendees: Array.isArray(evt.attendees)\n ? (evt.attendees as any[]).map((a) => ({\n email: a.emailAddress?.address,\n displayName: a.emailAddress?.name,\n responseStatus: a.status?.response,\n }))\n : evt.attendees,\n status: evt.showAs || evt.status,\n };\n}\n\nfunction normalizeDriveItem(item: Record<string, unknown>): Record<string, unknown> {\n return {\n id: item.id,\n name: item.name,\n mimeType: item.file && typeof item.file === \"object\" ? (item.file as any).mimeType : item.mimeType,\n modifiedTime: item.lastModifiedDateTime || item.modifiedTime,\n size: item.size,\n webViewLink: item.webUrl || item.webViewLink,\n shared: item.shared !== undefined,\n };\n}\n\nfunction normalizeArray(items: unknown[], normalizer: (item: Record<string, unknown>) => Record<string, unknown>): unknown[] {\n return items.map((item) =>\n typeof item === \"object\" && item !== null ? normalizer(item as Record<string, unknown>) : item,\n );\n}\n\nexport function normalizeMicrosoftMail(data: unknown): unknown {\n if (typeof data !== \"object\" || data === null) return data;\n const d = data as Record<string, unknown>;\n\n // Array of messages\n if (Array.isArray(d.value)) {\n return { messages: normalizeArray(d.value, normalizeMailItem) };\n }\n if (Array.isArray(d.messages)) {\n return { messages: normalizeArray(d.messages, normalizeMailItem) };\n }\n // Single message\n if (d.subject || d.from || d.bodyPreview) {\n return normalizeMailItem(d);\n }\n return data;\n}\n\nexport function normalizeMicrosoftCalendar(data: unknown): unknown {\n if (typeof data !== \"object\" || data === null) return data;\n const d = data as Record<string, unknown>;\n\n if (Array.isArray(d.value)) {\n return { events: normalizeArray(d.value, normalizeCalendarItem) };\n }\n if (Array.isArray(d.events)) {\n return { events: normalizeArray(d.events, normalizeCalendarItem) };\n }\n if (d.subject || d.start) {\n return normalizeCalendarItem(d);\n }\n return data;\n}\n\nexport function normalizeMicrosoftDrive(data: unknown): unknown {\n if (typeof data !== \"object\" || data === null) return data;\n const d = data as Record<string, unknown>;\n\n if (Array.isArray(d.value)) {\n return { files: normalizeArray(d.value, normalizeDriveItem) };\n }\n if (Array.isArray(d.files)) {\n return { files: normalizeArray(d.files, normalizeDriveItem) };\n }\n if (d.name && (d.lastModifiedDateTime || d.webUrl)) {\n return normalizeDriveItem(d);\n }\n return data;\n}\n","import React from \"react\";\nimport { Mail, Paperclip, Tag } from \"lucide-react\";\n\ninterface EmailData {\n id?: string;\n subject?: string;\n from?: string;\n to?: string | string[];\n date?: string;\n snippet?: string;\n body?: string;\n hasAttachments?: boolean;\n labels?: string[];\n /** Supyagent API returns labelIds instead of labels */\n labelIds?: string[];\n isUnread?: boolean;\n isStarred?: boolean;\n}\n\ninterface EmailFormatterProps {\n data: unknown;\n}\n\nfunction isEmailData(data: unknown): data is EmailData {\n return typeof data === \"object\" && data !== null && (\"subject\" in data || \"from\" in data || \"snippet\" in data);\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction formatRecipients(to: string | string[] | undefined): string | null {\n if (!to) return null;\n if (Array.isArray(to)) return to.join(\", \");\n return to;\n}\n\n/** Internal Gmail label IDs that shouldn't be shown as tags */\nconst HIDDEN_LABELS = new Set([\"INBOX\", \"UNREAD\", \"SENT\", \"DRAFT\", \"SPAM\", \"TRASH\", \"STARRED\", \"IMPORTANT\"]);\n\nfunction humanizeLabel(label: string): string {\n // \"CATEGORY_UPDATES\" → \"Updates\", \"CATEGORY_PERSONAL\" → \"Personal\"\n if (label.startsWith(\"CATEGORY_\")) return label.slice(9).charAt(0) + label.slice(10).toLowerCase();\n return label;\n}\n\nfunction resolveLabels(email: EmailData): string[] {\n if (email.labels && email.labels.length > 0) return email.labels;\n if (email.labelIds && email.labelIds.length > 0) {\n return email.labelIds\n .filter((id) => !HIDDEN_LABELS.has(id))\n .map(humanizeLabel);\n }\n return [];\n}\n\nfunction EmailCard({ email }: { email: EmailData }) {\n const recipients = formatRecipients(email.to);\n const labels = resolveLabels(email);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <Mail className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {email.subject || \"No subject\"}\n </p>\n {email.from && (\n <p className=\"text-xs text-muted-foreground truncate\">{email.from}</p>\n )}\n {recipients && (\n <p className=\"text-xs text-muted-foreground truncate\">To: {recipients}</p>\n )}\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {email.hasAttachments && (\n <Paperclip className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n {email.date && (\n <span className=\"text-xs text-muted-foreground\">{formatRelativeDate(email.date)}</span>\n )}\n </div>\n </div>\n {labels.length > 0 && (\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n {labels.map((label) => (\n <span\n key={label}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground\"\n >\n <Tag className=\"h-2.5 w-2.5\" />\n {label}\n </span>\n ))}\n </div>\n )}\n {(email.snippet || email.body) && (\n <p className=\"text-xs text-muted-foreground line-clamp-3\">\n {email.snippet || email.body}\n </p>\n )}\n </div>\n );\n}\n\nexport function EmailFormatter({ data }: EmailFormatterProps) {\n if (isEmailData(data)) {\n return <EmailCard email={data} />;\n }\n\n if (Array.isArray(data)) {\n const emails = data.filter(isEmailData);\n if (emails.length > 0) {\n return (\n <div className=\"space-y-2\">\n {emails.map((email, i) => (\n <EmailCard key={email.id || i} email={email} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const messages = (data as { messages: unknown[] }).messages;\n if (Array.isArray(messages)) {\n const emails = messages.filter(isEmailData);\n if (emails.length > 0) {\n return (\n <div className=\"space-y-2\">\n {emails.map((email, i) => (\n <EmailCard key={email.id || i} email={email} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Calendar, MapPin, Users, Check, X, HelpCircle } from \"lucide-react\";\n\ninterface CalendarEventData {\n id?: string;\n summary?: string;\n description?: string;\n start?: { dateTime?: string; date?: string };\n end?: { dateTime?: string; date?: string };\n location?: string;\n attendees?: Array<{\n email?: string;\n displayName?: string;\n responseStatus?: string;\n }>;\n status?: string;\n}\n\ninterface CalendarEventFormatterProps {\n data: unknown;\n}\n\nfunction isCalendarEvent(data: unknown): data is CalendarEventData {\n return typeof data === \"object\" && data !== null && (\"summary\" in data || \"start\" in data);\n}\n\nfunction formatRelativeDateTime(dt?: { dateTime?: string; date?: string }): string {\n if (!dt) return \"\";\n const raw = dt.dateTime || dt.date;\n if (!raw) return \"\";\n try {\n const date = new Date(raw);\n const now = new Date();\n const diffMs = date.getTime() - now.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n\n const timeStr = dt.dateTime\n ? date.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\" })\n : \"\";\n\n if (diffDays === 0) {\n return timeStr ? `Today at ${timeStr}` : \"Today\";\n }\n if (diffDays === 1) {\n return timeStr ? `Tomorrow at ${timeStr}` : \"Tomorrow\";\n }\n if (diffDays === -1) {\n return timeStr ? `Yesterday at ${timeStr}` : \"Yesterday\";\n }\n if (diffDays > 1 && diffDays < 7) {\n const dayName = date.toLocaleDateString(undefined, { weekday: \"long\" });\n return timeStr ? `${dayName} at ${timeStr}` : dayName;\n }\n\n return dt.dateTime\n ? date.toLocaleString(undefined, { dateStyle: \"medium\", timeStyle: \"short\" })\n : date.toLocaleDateString(undefined, { dateStyle: \"medium\" });\n } catch {\n return raw;\n }\n}\n\nfunction ResponseStatusIcon({ status }: { status?: string }) {\n switch (status) {\n case \"accepted\":\n return <Check className=\"h-3 w-3 text-green-500\" />;\n case \"declined\":\n return <X className=\"h-3 w-3 text-destructive\" />;\n case \"tentative\":\n return <HelpCircle className=\"h-3 w-3 text-yellow-500\" />;\n default:\n return <HelpCircle className=\"h-3 w-3 text-muted-foreground\" />;\n }\n}\n\nfunction EventCard({ event }: { event: CalendarEventData }) {\n const startStr = formatRelativeDateTime(event.start);\n const endStr = formatRelativeDateTime(event.end);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {event.summary || \"Untitled event\"}\n </p>\n {startStr && (\n <p className=\"text-xs text-muted-foreground\">\n {startStr}\n {endStr ? ` \\u2192 ${endStr}` : \"\"}\n </p>\n )}\n </div>\n </div>\n {event.location && (\n <div className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <MapPin className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{event.location}</span>\n </div>\n )}\n {event.attendees && event.attendees.length > 0 && (\n <div className=\"flex items-start gap-1.5 text-xs text-muted-foreground\">\n <Users className=\"h-3 w-3 shrink-0 mt-0.5\" />\n <div className=\"flex flex-wrap gap-x-3 gap-y-1\">\n {event.attendees.map((a, i) => (\n <span key={i} className=\"inline-flex items-center gap-1\">\n <ResponseStatusIcon status={a.responseStatus} />\n {a.displayName || a.email}\n </span>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport function CalendarEventFormatter({ data }: CalendarEventFormatterProps) {\n if (isCalendarEvent(data)) {\n return <EventCard event={data} />;\n }\n\n if (Array.isArray(data)) {\n const events = data.filter(isCalendarEvent);\n if (events.length > 0) {\n return (\n <div className=\"space-y-2\">\n {events.map((event, i) => (\n <EventCard key={event.id || i} event={event} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"events\" in data) {\n const events = (data as { events: unknown[] }).events;\n if (Array.isArray(events)) {\n const calEvents = events.filter(isCalendarEvent);\n if (calEvents.length > 0) {\n return (\n <div className=\"space-y-2\">\n {calEvents.map((event, i) => (\n <EventCard key={event.id || i} event={event} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { MessageSquare, Hash, Reply } from \"lucide-react\";\n\ninterface SlackMessageData {\n text?: string;\n channel?: string;\n user?: string;\n ts?: string;\n ok?: boolean;\n reactions?: Array<{ name: string; count?: number }>;\n thread_ts?: string;\n reply_count?: number;\n channels?: Array<{ id?: string; name?: string; num_members?: number; memberCount?: number }>;\n}\n\ninterface SlackMessageFormatterProps {\n data: unknown;\n}\n\nfunction isSlackMessage(data: unknown): data is SlackMessageData {\n return typeof data === \"object\" && data !== null && (\"text\" in data || \"channel\" in data);\n}\n\nfunction isChannelList(data: unknown): data is { channels: Array<{ id?: string; name?: string; num_members?: number; memberCount?: number }> } {\n return typeof data === \"object\" && data !== null && \"channels\" in data && Array.isArray((data as any).channels);\n}\n\nfunction MessageBubble({ message }: { message: SlackMessageData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {message.channel && (\n <span className=\"flex items-center gap-0.5 text-xs text-muted-foreground\">\n <Hash className=\"h-3 w-3\" />\n {message.channel}\n </span>\n )}\n {message.user && (\n <span className=\"text-xs font-medium text-foreground\">{message.user}</span>\n )}\n {message.thread_ts && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Reply className=\"h-3 w-3\" />\n {message.reply_count ? `${message.reply_count} replies` : \"Thread\"}\n </span>\n )}\n </div>\n {message.text && (\n <p className=\"text-sm text-foreground\">{message.text}</p>\n )}\n {message.reactions && message.reactions.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {message.reactions.map((reaction) => (\n <span\n key={reaction.name}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground\"\n >\n :{reaction.name}:\n {reaction.count && reaction.count > 1 && (\n <span className=\"font-medium\">{reaction.count}</span>\n )}\n </span>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ChannelCard({ channel }: { channel: { id?: string; name?: string; num_members?: number; memberCount?: number } }) {\n const members = channel.num_members ?? channel.memberCount;\n return (\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-card p-3\">\n <Hash className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm text-foreground flex-1\">{channel.name || channel.id}</span>\n {members !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{members} members</span>\n )}\n </div>\n );\n}\n\nexport function SlackMessageFormatter({ data }: SlackMessageFormatterProps) {\n // Channel list response\n if (isChannelList(data)) {\n const channels = (data as any).channels;\n return (\n <div className=\"space-y-1.5\">\n {channels.map((ch: any, i: number) => (\n <ChannelCard key={ch.id || i} channel={ch} />\n ))}\n </div>\n );\n }\n\n if (isSlackMessage(data)) {\n return <MessageBubble message={data} />;\n }\n\n if (Array.isArray(data)) {\n const messages = data.filter(isSlackMessage);\n if (messages.length > 0) {\n return (\n <div className=\"space-y-2\">\n {messages.map((msg, i) => (\n <MessageBubble key={msg.ts || i} message={msg} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const messages = (data as { messages: unknown[] }).messages;\n if (Array.isArray(messages)) {\n const slackMsgs = messages.filter(isSlackMessage);\n if (slackMsgs.length > 0) {\n return (\n <div className=\"space-y-2\">\n {slackMsgs.map((msg, i) => (\n <MessageBubble key={msg.ts || i} message={msg} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { CircleDot, GitPullRequest, GitMerge, Clock } from \"lucide-react\";\n\ninterface GithubItemData {\n title?: string;\n number?: number;\n state?: string;\n html_url?: string;\n body?: string;\n user?: { login?: string };\n created_at?: string;\n pull_request?: unknown;\n merged?: boolean;\n labels?: Array<{ name: string; color?: string }>;\n}\n\ninterface GithubFormatterProps {\n data: unknown;\n}\n\nfunction isGithubItem(data: unknown): data is GithubItemData {\n return typeof data === \"object\" && data !== null && (\"title\" in data || \"number\" in data);\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffDays === 0) return \"today\";\n if (diffDays === 1) return \"yesterday\";\n if (diffDays < 30) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction getStateInfo(item: GithubItemData) {\n const isPR = !!item.pull_request;\n\n if (isPR && item.merged) {\n return { icon: GitMerge, color: \"text-purple-500\", label: \"Merged\" };\n }\n if (item.state === \"open\") {\n return {\n icon: isPR ? GitPullRequest : CircleDot,\n color: \"text-green-500\",\n label: \"Open\",\n };\n }\n return {\n icon: isPR ? GitPullRequest : CircleDot,\n color: \"text-destructive\",\n label: \"Closed\",\n };\n}\n\nfunction GithubCard({ item }: { item: GithubItemData }) {\n const { icon: StateIcon, color: stateColor, label: stateLabel } = getStateInfo(item);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <StateIcon className={`h-4 w-4 mt-0.5 shrink-0 ${stateColor}`} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {item.html_url ? (\n <a href={item.html_url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {item.title}\n </a>\n ) : (\n item.title\n )}\n {item.number && (\n <span className=\"text-muted-foreground font-normal\"> #{item.number}</span>\n )}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className={`text-xs ${stateColor}`}>{stateLabel}</span>\n {item.user?.login && (\n <span className=\"text-xs text-muted-foreground\">{item.user.login}</span>\n )}\n {item.created_at && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate(item.created_at)}\n </span>\n )}\n </div>\n </div>\n </div>\n {item.labels && item.labels.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {item.labels.map((label) => (\n <span\n key={label.name}\n className=\"rounded-full border border-border px-2 py-0.5 text-xs text-muted-foreground\"\n style={\n label.color\n ? { borderColor: `#${label.color}`, color: `#${label.color}` }\n : undefined\n }\n >\n {label.name}\n </span>\n ))}\n </div>\n )}\n {item.body && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{item.body}</p>\n )}\n </div>\n );\n}\n\nexport function GithubFormatter({ data }: GithubFormatterProps) {\n if (isGithubItem(data)) {\n return <GithubCard item={data} />;\n }\n\n if (Array.isArray(data)) {\n const items = data.filter(isGithubItem);\n if (items.length > 0) {\n return (\n <div className=\"space-y-2\">\n {items.map((item, i) => (\n <GithubCard key={item.number || i} item={item} />\n ))}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { FileText, Folder, Image, Film, FileSpreadsheet, ExternalLink, Users as UsersIcon } from \"lucide-react\";\n\ninterface DriveFileData {\n id?: string;\n name?: string;\n mimeType?: string;\n modifiedTime?: string;\n size?: string | number;\n webViewLink?: string;\n shared?: boolean;\n}\n\ninterface DriveFileFormatterProps {\n data: unknown;\n}\n\nfunction isDriveFile(data: unknown): data is DriveFileData {\n return typeof data === \"object\" && data !== null && (\"name\" in data || \"mimeType\" in data);\n}\n\nfunction getFileIcon(mimeType?: string) {\n if (!mimeType) return FileText;\n if (mimeType.includes(\"folder\")) return Folder;\n if (mimeType.includes(\"image\")) return Image;\n if (mimeType.includes(\"video\")) return Film;\n if (mimeType.includes(\"spreadsheet\") || mimeType.includes(\"excel\")) return FileSpreadsheet;\n return FileText;\n}\n\nfunction formatFileSize(size: string | number | undefined): string | null {\n if (size === undefined) return null;\n const bytes = typeof size === \"string\" ? parseInt(size, 10) : size;\n if (isNaN(bytes)) return null;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1048576) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1073741824) return `${(bytes / 1048576).toFixed(1)} MB`;\n return `${(bytes / 1073741824).toFixed(1)} GB`;\n}\n\nfunction FileCard({ file }: { file: DriveFileData }) {\n const Icon = getFileIcon(file.mimeType);\n const sizeStr = formatFileSize(file.size);\n\n return (\n <div className=\"flex items-center gap-3 rounded-lg border border-border bg-card p-3\">\n <Icon className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm text-foreground truncate\">\n {file.webViewLink ? (\n <a href={file.webViewLink} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {file.name || \"Untitled\"}\n </a>\n ) : (\n file.name || \"Untitled\"\n )}\n </p>\n <div className=\"flex items-center gap-2\">\n {file.modifiedTime && (\n <span className=\"text-xs text-muted-foreground\">\n {new Date(file.modifiedTime).toLocaleDateString()}\n </span>\n )}\n {sizeStr && (\n <span className=\"text-xs text-muted-foreground\">{sizeStr}</span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {file.shared && (\n <span title=\"Shared\">\n <UsersIcon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </span>\n )}\n {file.webViewLink && (\n <a href={file.webViewLink} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n </div>\n );\n}\n\nexport function DriveFileFormatter({ data }: DriveFileFormatterProps) {\n if (isDriveFile(data)) {\n return <FileCard file={data} />;\n }\n\n if (Array.isArray(data)) {\n const files = data.filter(isDriveFile);\n if (files.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {files.map((file, i) => (\n <FileCard key={file.id || i} file={file} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"files\" in data) {\n const files = (data as { files: unknown[] }).files;\n if (Array.isArray(files)) {\n const driveFiles = files.filter(isDriveFile);\n if (driveFiles.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {driveFiles.map((file, i) => (\n <FileCard key={file.id || i} file={file} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { ExternalLink, Search } from \"lucide-react\";\n\ninterface SearchResult {\n title?: string;\n link?: string;\n url?: string;\n snippet?: string;\n description?: string;\n position?: number;\n}\n\ninterface SearchData {\n results?: SearchResult[];\n organic?: SearchResult[];\n answer?: string;\n answerBox?: { answer?: string; snippet?: string; title?: string };\n relatedSearches?: Array<{ query?: string }>;\n related_searches?: Array<{ query?: string }>;\n}\n\ninterface SearchFormatterProps {\n data: unknown;\n}\n\nfunction isSearchData(data: unknown): data is SearchData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"results\" in data || \"organic\" in data || \"answer\" in data || \"answerBox\" in data;\n}\n\nfunction isSearchResult(data: unknown): data is SearchResult {\n return typeof data === \"object\" && data !== null && (\"title\" in data || \"link\" in data || \"url\" in data);\n}\n\nfunction getDomain(url: string): string {\n try {\n return new URL(url).hostname.replace(\"www.\", \"\");\n } catch {\n return url;\n }\n}\n\nfunction ResultCard({ result }: { result: SearchResult }) {\n const href = result.link || result.url;\n const snippet = result.snippet || result.description;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <div className=\"min-w-0 flex-1\">\n {href ? (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-primary hover:underline\"\n >\n {result.title || href}\n </a>\n ) : (\n <p className=\"text-sm font-medium text-foreground\">{result.title}</p>\n )}\n {href && (\n <p className=\"text-xs text-muted-foreground truncate\">{getDomain(href)}</p>\n )}\n </div>\n {href && (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n {snippet && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{snippet}</p>\n )}\n </div>\n );\n}\n\nexport function SearchFormatter({ data }: SearchFormatterProps) {\n if (isSearchData(data)) {\n const results = data.results || data.organic || [];\n const answerText = data.answer || data.answerBox?.answer || data.answerBox?.snippet;\n const related = data.relatedSearches || data.related_searches;\n\n return (\n <div className=\"space-y-3\">\n {answerText && (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <p className=\"text-sm text-foreground\">{answerText}</p>\n {data.answerBox?.title && (\n <p className=\"text-xs text-muted-foreground mt-1\">{data.answerBox.title}</p>\n )}\n </div>\n )}\n\n {results.length > 0 && (\n <div className=\"space-y-2\">\n {results.filter(isSearchResult).map((result, i) => (\n <ResultCard key={result.link || result.url || i} result={result} />\n ))}\n </div>\n )}\n\n {related && related.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {related.map((r, i) => (\n <span\n key={i}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2.5 py-1 text-xs text-muted-foreground\"\n >\n <Search className=\"h-3 w-3\" />\n {r.query}\n </span>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n // Array of results\n if (Array.isArray(data)) {\n const results = data.filter(isSearchResult);\n if (results.length > 0) {\n return (\n <div className=\"space-y-2\">\n {results.map((result, i) => (\n <ResultCard key={result.link || result.url || i} result={result} />\n ))}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { FileText, ExternalLink } from \"lucide-react\";\n\ninterface DocData {\n documentId?: string;\n title?: string;\n body?: { content?: unknown };\n revisionId?: string;\n url?: string;\n content?: string;\n}\n\ninterface DocsFormatterProps {\n data: unknown;\n}\n\nfunction isDocData(data: unknown): data is DocData {\n return typeof data === \"object\" && data !== null && (\"documentId\" in data || \"title\" in data);\n}\n\nfunction extractTextContent(body: unknown): string | null {\n if (!body || typeof body !== \"object\") return null;\n const content = (body as any).content;\n if (!Array.isArray(content)) return null;\n\n const texts: string[] = [];\n for (const element of content) {\n if (element?.paragraph?.elements) {\n for (const el of element.paragraph.elements) {\n if (el?.textRun?.content) {\n texts.push(el.textRun.content);\n }\n }\n }\n }\n return texts.length > 0 ? texts.join(\"\").trim() : null;\n}\n\nfunction DocCard({ doc }: { doc: DocData }) {\n const docUrl = doc.url || (doc.documentId ? `https://docs.google.com/document/d/${doc.documentId}` : null);\n const textContent = doc.content || extractTextContent(doc.body);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <FileText className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {docUrl ? (\n <a href={docUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {doc.title || \"Untitled document\"}\n </a>\n ) : (\n doc.title || \"Untitled document\"\n )}\n </p>\n </div>\n {docUrl && (\n <a href={docUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n {textContent && (\n <p className=\"text-xs text-muted-foreground line-clamp-4 whitespace-pre-wrap\">{textContent}</p>\n )}\n </div>\n );\n}\n\nexport function DocsFormatter({ data }: DocsFormatterProps) {\n if (isDocData(data)) {\n return <DocCard doc={data} />;\n }\n\n if (Array.isArray(data)) {\n const docs = data.filter(isDocData);\n if (docs.length > 0) {\n return (\n <div className=\"space-y-2\">\n {docs.map((doc, i) => (\n <DocCard key={doc.documentId || i} doc={doc} />\n ))}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Table2, ExternalLink } from \"lucide-react\";\n\ninterface SheetsData {\n spreadsheetId?: string;\n title?: string;\n url?: string;\n values?: unknown[][];\n range?: string;\n updatedRange?: string;\n updatedRows?: number;\n updatedColumns?: number;\n updatedCells?: number;\n sheets?: Array<{ properties?: { title?: string; sheetId?: number } }>;\n}\n\ninterface SheetsFormatterProps {\n data: unknown;\n}\n\nfunction isSheetsData(data: unknown): data is SheetsData {\n return typeof data === \"object\" && data !== null && (\"spreadsheetId\" in data || \"values\" in data || \"range\" in data || \"updatedRange\" in data);\n}\n\nfunction SheetsTable({ values }: { values: unknown[][] }) {\n if (values.length === 0) return null;\n\n const headers = values[0] as string[];\n const rows = values.slice(1);\n\n return (\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"border-b border-border bg-muted\">\n {headers.map((header, i) => (\n <th key={i} className=\"px-3 py-2 text-left font-medium text-foreground whitespace-nowrap\">\n {String(header)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => (\n <tr key={rowIdx} className=\"border-b border-border last:border-0\">\n {headers.map((_, colIdx) => (\n <td key={colIdx} className=\"px-3 py-1.5 text-muted-foreground whitespace-nowrap\">\n {String((row as unknown[])[colIdx] ?? \"\")}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction SheetsCard({ sheet }: { sheet: SheetsData }) {\n const sheetUrl = sheet.url || (sheet.spreadsheetId ? `https://docs.google.com/spreadsheets/d/${sheet.spreadsheetId}` : null);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <Table2 className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {sheetUrl ? (\n <a href={sheetUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {sheet.title || \"Spreadsheet\"}\n </a>\n ) : (\n sheet.title || \"Spreadsheet\"\n )}\n </p>\n {(sheet.updatedRange || sheet.range) && (\n <p className=\"text-xs text-muted-foreground\">\n {sheet.updatedRange || sheet.range}\n {sheet.updatedCells !== undefined && ` \\u00B7 ${sheet.updatedCells} cells updated`}\n </p>\n )}\n </div>\n {sheetUrl && (\n <a href={sheetUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n </div>\n\n {sheet.values && sheet.values.length > 0 && (\n <SheetsTable values={sheet.values} />\n )}\n </div>\n );\n}\n\nexport function SheetsFormatter({ data }: SheetsFormatterProps) {\n if (isSheetsData(data)) {\n return <SheetsCard sheet={data} />;\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Presentation, ExternalLink } from \"lucide-react\";\n\ninterface SlidesData {\n presentationId?: string;\n title?: string;\n url?: string;\n slides?: unknown[];\n pageSize?: unknown;\n}\n\ninterface SlidesFormatterProps {\n data: unknown;\n}\n\nfunction isSlidesData(data: unknown): data is SlidesData {\n return typeof data === \"object\" && data !== null && (\"presentationId\" in data || (\"title\" in data && \"slides\" in data));\n}\n\nfunction SlidesCard({ presentation }: { presentation: SlidesData }) {\n const slideUrl = presentation.url || (presentation.presentationId ? `https://docs.google.com/presentation/d/${presentation.presentationId}` : null);\n const slideCount = presentation.slides?.length;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <Presentation className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {slideUrl ? (\n <a href={slideUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {presentation.title || \"Presentation\"}\n </a>\n ) : (\n presentation.title || \"Presentation\"\n )}\n </p>\n {slideCount !== undefined && (\n <p className=\"text-xs text-muted-foreground\">\n {slideCount} {slideCount === 1 ? \"slide\" : \"slides\"}\n </p>\n )}\n </div>\n {slideUrl && (\n <a href={slideUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"shrink-0 text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n )}\n </div>\n </div>\n );\n}\n\nexport function SlidesFormatter({ data }: SlidesFormatterProps) {\n if (isSlidesData(data)) {\n return <SlidesCard presentation={data} />;\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport {\n Users,\n Building2,\n Mail,\n Phone,\n Globe,\n Briefcase,\n DollarSign,\n Calendar,\n} from \"lucide-react\";\n\n/* ------------------------------------------------------------------ */\n/* Interfaces */\n/* ------------------------------------------------------------------ */\n\ninterface HubspotContactData {\n id?: string;\n firstName?: string;\n lastName?: string;\n email?: string;\n phone?: string;\n company?: string;\n properties?: {\n firstname?: string;\n lastname?: string;\n email?: string;\n phone?: string;\n company?: string;\n [key: string]: unknown;\n };\n}\n\ninterface HubspotCompanyData {\n id?: string;\n name?: string;\n domain?: string;\n industry?: string;\n employeeCount?: number | null;\n createdAt?: string;\n updatedAt?: string;\n /** Legacy shape: raw HubSpot properties */\n properties?: {\n name?: string;\n domain?: string;\n industry?: string;\n phone?: string;\n numberofemployees?: string;\n [key: string]: unknown;\n };\n}\n\ninterface HubspotDealData {\n id?: string;\n name?: string;\n amount?: number | null;\n stage?: string;\n closeDate?: string;\n pipeline?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\ninterface HubspotFormatterProps {\n data: unknown;\n}\n\n/* ------------------------------------------------------------------ */\n/* Type guards */\n/* ------------------------------------------------------------------ */\n\nfunction isHubspotContact(data: unknown): data is HubspotContactData {\n if (typeof data !== \"object\" || data === null) return false;\n const d = data as any;\n if (\"firstName\" in d || \"lastName\" in d || (d.email && d.id)) return true;\n const props = d.properties;\n return props && (\"firstname\" in props || \"lastname\" in props || \"email\" in props);\n}\n\nfunction isHubspotCompany(data: unknown): data is HubspotCompanyData {\n if (typeof data !== \"object\" || data === null) return false;\n const d = data as any;\n // Flat shape from Supyagent API (has domain at top level)\n if (\"domain\" in d && !(\"email\" in d) && !(\"amount\" in d)) return true;\n // Legacy raw HubSpot properties shape\n const props = d.properties;\n return props && (\"name\" in props || \"domain\" in props);\n}\n\nfunction isHubspotDeal(data: unknown): data is HubspotDealData {\n if (typeof data !== \"object\" || data === null) return false;\n const d = data as any;\n return (\"amount\" in d || \"stage\" in d || \"closeDate\" in d) && !(\"email\" in d);\n}\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction formatCurrency(value: number): string {\n try {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return `$${value.toLocaleString()}`;\n }\n}\n\nfunction formatDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return dateStr;\n }\n}\n\nfunction getStageBadge(stage?: string) {\n if (!stage) return null;\n const s = stage.toLowerCase();\n if (s === \"closedwon\" || s === \"closed won\")\n return { label: \"Won\", className: \"text-green-500 bg-green-500/10\" };\n if (s === \"closedlost\" || s === \"closed lost\")\n return { label: \"Lost\", className: \"text-red-400 bg-red-400/10\" };\n // Custom stage IDs — show as \"In Progress\"\n if (/^\\d+$/.test(stage))\n return { label: \"In Progress\", className: \"text-blue-400 bg-blue-400/10\" };\n return { label: stage, className: \"text-muted-foreground bg-muted\" };\n}\n\n/* ------------------------------------------------------------------ */\n/* Cards */\n/* ------------------------------------------------------------------ */\n\nfunction ContactCard({ contact }: { contact: HubspotContactData }) {\n const p = contact.properties || {};\n const first = contact.firstName || p.firstname;\n const last = contact.lastName || p.lastname;\n const email = contact.email || p.email;\n const phone = contact.phone || p.phone;\n const company = contact.company || p.company;\n const name = [first, last].filter(Boolean).join(\" \") || \"Unknown contact\";\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Users className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{name}</p>\n {company && (\n <p className=\"text-xs text-muted-foreground\">{company}</p>\n )}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6\">\n {email && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Mail className=\"h-3 w-3\" />\n {email}\n </span>\n )}\n {phone && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Phone className=\"h-3 w-3\" />\n {phone}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction CompanyCard({ company }: { company: HubspotCompanyData }) {\n const p = company.properties || {};\n const name = company.name || p.name;\n const domain = company.domain || p.domain;\n const industry = company.industry || p.industry;\n const phone = p.phone;\n const employeeCount =\n company.employeeCount ?? (p.numberofemployees ? Number(p.numberofemployees) : null);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Building2 className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {name || \"Unknown company\"}\n </p>\n {industry && (\n <p className=\"text-xs text-muted-foreground\">{industry}</p>\n )}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6 text-xs text-muted-foreground\">\n {domain && (\n <span className=\"flex items-center gap-1\">\n <Globe className=\"h-3 w-3\" />\n {domain}\n </span>\n )}\n {phone && (\n <span className=\"flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {phone}\n </span>\n )}\n {employeeCount != null && employeeCount > 0 && (\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {employeeCount.toLocaleString()} employees\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction DealCard({ deal }: { deal: HubspotDealData }) {\n const stageBadge = getStageBadge(deal.stage);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Briefcase className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {deal.name || \"Untitled deal\"}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {deal.amount != null && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-foreground\">\n <DollarSign className=\"h-3 w-3\" />\n {formatCurrency(deal.amount)}\n </span>\n )}\n {stageBadge && (\n <span\n className={`rounded-full px-2 py-0.5 text-xs ${stageBadge.className}`}\n >\n {stageBadge.label}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6 text-xs text-muted-foreground\">\n {deal.closeDate && (\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n Close: {formatDate(deal.closeDate)}\n </span>\n )}\n {deal.pipeline && deal.pipeline !== \"default\" && (\n <span>{deal.pipeline}</span>\n )}\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* List wrapper with optional paging indicator */\n/* ------------------------------------------------------------------ */\n\nfunction ListWrapper({\n children,\n hasMore,\n}: {\n children: React.ReactNode;\n hasMore?: boolean;\n}) {\n return (\n <div className=\"space-y-2\">\n {children}\n {hasMore && (\n <p className=\"text-xs text-muted-foreground text-center pt-1\">\n More results available\n </p>\n )}\n </div>\n );\n}\n\nfunction hasPaging(data: unknown): boolean {\n if (typeof data !== \"object\" || data === null) return false;\n const paging = (data as any).paging;\n return paging && typeof paging === \"object\" && paging.next;\n}\n\n/* ------------------------------------------------------------------ */\n/* Formatter */\n/* ------------------------------------------------------------------ */\n\nexport function HubspotFormatter({ data }: HubspotFormatterProps) {\n // Single contact\n if (isHubspotContact(data)) {\n return <ContactCard contact={data} />;\n }\n\n // Single deal\n if (isHubspotDeal(data)) {\n return <DealCard deal={data} />;\n }\n\n // Single company\n if (isHubspotCompany(data)) {\n return <CompanyCard company={data} />;\n }\n\n // Flat array\n if (Array.isArray(data)) {\n const deals = data.filter(isHubspotDeal);\n if (deals.length > 0) {\n return (\n <ListWrapper>\n {deals.map((d, i) => (\n <DealCard key={d.id || i} deal={d} />\n ))}\n </ListWrapper>\n );\n }\n const contacts = data.filter(isHubspotContact);\n if (contacts.length > 0) {\n return (\n <ListWrapper>\n {contacts.map((c, i) => (\n <ContactCard key={c.id || i} contact={c} />\n ))}\n </ListWrapper>\n );\n }\n const companies = data.filter(isHubspotCompany);\n if (companies.length > 0) {\n return (\n <ListWrapper>\n {companies.map((c, i) => (\n <CompanyCard key={c.id || i} company={c} />\n ))}\n </ListWrapper>\n );\n }\n }\n\n // Wrapper objects: { contacts: [...] }, { companies: [...] }, { deals: [...] }\n if (typeof data === \"object\" && data !== null) {\n const d = data as any;\n const more = hasPaging(data);\n\n if (\"contacts\" in d && Array.isArray(d.contacts)) {\n const valid = d.contacts.filter(isHubspotContact);\n if (valid.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {valid.map((c: HubspotContactData, i: number) => (\n <ContactCard key={c.id || i} contact={c} />\n ))}\n </ListWrapper>\n );\n }\n }\n\n if (\"companies\" in d && Array.isArray(d.companies)) {\n const valid = d.companies.filter(isHubspotCompany);\n if (valid.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {valid.map((c: HubspotCompanyData, i: number) => (\n <CompanyCard key={c.id || i} company={c} />\n ))}\n </ListWrapper>\n );\n }\n }\n\n if (\"deals\" in d && Array.isArray(d.deals)) {\n const valid = d.deals.filter(isHubspotDeal);\n if (valid.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {valid.map((deal: HubspotDealData, i: number) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </ListWrapper>\n );\n }\n }\n\n // Raw HubSpot shape: { results: [...] }\n if (\"results\" in d && Array.isArray(d.results)) {\n const results = d.results;\n const deals = results.filter(isHubspotDeal);\n if (deals.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {deals.map((deal: HubspotDealData, i: number) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </ListWrapper>\n );\n }\n const contacts = results.filter(isHubspotContact);\n if (contacts.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {contacts.map((c: HubspotContactData, i: number) => (\n <ContactCard key={c.id || i} contact={c} />\n ))}\n </ListWrapper>\n );\n }\n const companies = results.filter(isHubspotCompany);\n if (companies.length > 0) {\n return (\n <ListWrapper hasMore={more}>\n {companies.map((c: HubspotCompanyData, i: number) => (\n <CompanyCard key={c.id || i} company={c} />\n ))}\n </ListWrapper>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { CircleDot, FolderKanban } from \"lucide-react\";\n\ninterface LinearIssueData {\n id?: string;\n title?: string;\n identifier?: string;\n state?: { name?: string; color?: string; type?: string };\n priority?: number;\n priorityLabel?: string;\n assignee?: { name?: string; displayName?: string; email?: string };\n url?: string;\n description?: string;\n}\n\ninterface LinearProjectData {\n id?: string;\n name?: string;\n state?: string;\n progress?: number;\n url?: string;\n description?: string;\n}\n\ninterface LinearFormatterProps {\n data: unknown;\n}\n\nfunction isLinearIssue(data: unknown): data is LinearIssueData {\n if (typeof data !== \"object\" || data === null) return false;\n return (\"title\" in data && (\"identifier\" in data || \"state\" in data || \"priority\" in data));\n}\n\nfunction isLinearProject(data: unknown): data is LinearProjectData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"name\" in data && (\"progress\" in data || (\"state\" in data && typeof (data as any).state === \"string\"));\n}\n\nconst PRIORITY_LABELS: Record<number, { label: string; style: string }> = {\n 0: { label: \"No priority\", style: \"text-muted-foreground\" },\n 1: { label: \"Urgent\", style: \"text-destructive\" },\n 2: { label: \"High\", style: \"text-orange-500\" },\n 3: { label: \"Medium\", style: \"text-yellow-500\" },\n 4: { label: \"Low\", style: \"text-muted-foreground\" },\n};\n\nfunction IssueCard({ issue }: { issue: LinearIssueData }) {\n const priorityInfo = issue.priority !== undefined ? PRIORITY_LABELS[issue.priority] : null;\n const assigneeName = issue.assignee?.displayName || issue.assignee?.name;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <CircleDot\n className=\"h-4 w-4 mt-0.5 shrink-0\"\n style={issue.state?.color ? { color: issue.state.color } : undefined}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {issue.url ? (\n <a href={issue.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {issue.title}\n </a>\n ) : (\n issue.title\n )}\n {issue.identifier && (\n <span className=\"text-muted-foreground font-normal\"> {issue.identifier}</span>\n )}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {issue.state?.name && (\n <span\n className=\"rounded-full bg-muted px-2 py-0.5 text-xs\"\n style={issue.state.color ? { color: issue.state.color } : undefined}\n >\n {issue.state.name}\n </span>\n )}\n {priorityInfo && (\n <span className={`text-xs ${priorityInfo.style}`}>\n {issue.priorityLabel || priorityInfo.label}\n </span>\n )}\n {assigneeName && (\n <span className=\"text-xs text-muted-foreground\">{assigneeName}</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ProjectCard({ project }: { project: LinearProjectData }) {\n const progressPercent = project.progress !== undefined ? Math.round(project.progress * 100) : null;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <FolderKanban className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {project.url ? (\n <a href={project.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {project.name}\n </a>\n ) : (\n project.name\n )}\n </p>\n {project.state && (\n <span className=\"text-xs text-muted-foreground\">{project.state}</span>\n )}\n </div>\n </div>\n {progressPercent !== null && (\n <div className=\"space-y-1\">\n <div className=\"h-1.5 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground text-right\">{progressPercent}%</p>\n </div>\n )}\n </div>\n );\n}\n\nexport function LinearFormatter({ data }: LinearFormatterProps) {\n if (isLinearIssue(data)) {\n return <IssueCard issue={data} />;\n }\n\n if (isLinearProject(data)) {\n return <ProjectCard project={data} />;\n }\n\n if (Array.isArray(data)) {\n const issues = data.filter(isLinearIssue);\n if (issues.length > 0) {\n return (\n <div className=\"space-y-2\">\n {issues.map((issue, i) => (\n <IssueCard key={issue.id || i} issue={issue} />\n ))}\n </div>\n );\n }\n const projects = data.filter(isLinearProject);\n if (projects.length > 0) {\n return (\n <div className=\"space-y-2\">\n {projects.map((project, i) => (\n <ProjectCard key={project.id || i} project={project} />\n ))}\n </div>\n );\n }\n }\n\n // Object with nodes/issues array (Linear API pattern)\n if (typeof data === \"object\" && data !== null) {\n const arr = (data as any).nodes || (data as any).issues || (data as any).projects;\n if (Array.isArray(arr)) {\n const issues = arr.filter(isLinearIssue);\n if (issues.length > 0) {\n return (\n <div className=\"space-y-2\">\n {issues.map((issue, i) => (\n <IssueCard key={issue.id || i} issue={issue} />\n ))}\n </div>\n );\n }\n const projects = arr.filter(isLinearProject);\n if (projects.length > 0) {\n return (\n <div className=\"space-y-2\">\n {projects.map((project, i) => (\n <ProjectCard key={project.id || i} project={project} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Briefcase, DollarSign } from \"lucide-react\";\n\ninterface PipedriveDealData {\n id?: number;\n title?: string;\n value?: number;\n currency?: string;\n status?: string;\n stage_id?: number;\n stage_name?: string;\n person_name?: string;\n org_name?: string;\n owner_name?: string;\n}\n\ninterface PipedriveFormatterProps {\n data: unknown;\n}\n\nfunction isPipedriveDeal(data: unknown): data is PipedriveDealData {\n return typeof data === \"object\" && data !== null && (\"title\" in data || \"value\" in data || \"status\" in data) && !(\"subject\" in data);\n}\n\nfunction formatCurrency(value: number, currency?: string): string {\n try {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: currency || \"USD\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n } catch {\n return `${currency || \"$\"}${value.toLocaleString()}`;\n }\n}\n\nfunction getStatusBadge(status?: string) {\n switch (status) {\n case \"won\":\n return { label: \"Won\", className: \"text-green-500 bg-green-500/10\" };\n case \"lost\":\n return { label: \"Lost\", className: \"text-destructive bg-destructive/10\" };\n case \"open\":\n return { label: \"Open\", className: \"text-primary bg-primary/10\" };\n case \"deleted\":\n return { label: \"Deleted\", className: \"text-muted-foreground bg-muted\" };\n default:\n return status ? { label: status, className: \"text-muted-foreground bg-muted\" } : null;\n }\n}\n\nfunction DealCard({ deal }: { deal: PipedriveDealData }) {\n const statusBadge = getStatusBadge(deal.status);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Briefcase className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{deal.title || \"Untitled deal\"}</p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {deal.value !== undefined && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-foreground\">\n <DollarSign className=\"h-3 w-3\" />\n {formatCurrency(deal.value, deal.currency)}\n </span>\n )}\n {statusBadge && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${statusBadge.className}`}>\n {statusBadge.label}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6 text-xs text-muted-foreground\">\n {deal.person_name && <span>{deal.person_name}</span>}\n {deal.org_name && <span>{deal.org_name}</span>}\n {deal.stage_name && <span>{deal.stage_name}</span>}\n </div>\n </div>\n );\n}\n\nexport function PipedriveFormatter({ data }: PipedriveFormatterProps) {\n if (isPipedriveDeal(data)) {\n return <DealCard deal={data} />;\n }\n\n if (Array.isArray(data)) {\n const deals = data.filter(isPipedriveDeal);\n if (deals.length > 0) {\n return (\n <div className=\"space-y-2\">\n {deals.map((deal, i) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </div>\n );\n }\n }\n\n // Supyagent API shape: { deals: [...], pagination }\n if (typeof data === \"object\" && data !== null && \"deals\" in data) {\n const items = (data as any).deals;\n if (Array.isArray(items)) {\n const deals = items.filter(isPipedriveDeal);\n if (deals.length > 0) {\n return (\n <div className=\"space-y-2\">\n {deals.map((deal, i) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </div>\n );\n }\n }\n }\n\n // Single deal wrapper: { deal: {...} }\n if (typeof data === \"object\" && data !== null && \"deal\" in data) {\n const item = (data as any).deal;\n if (isPipedriveDeal(item)) {\n return <DealCard deal={item} />;\n }\n }\n\n // Raw Pipedrive shape: { data: [...] }\n if (typeof data === \"object\" && data !== null && \"data\" in data) {\n const items = (data as any).data;\n if (Array.isArray(items)) {\n const deals = items.filter(isPipedriveDeal);\n if (deals.length > 0) {\n return (\n <div className=\"space-y-2\">\n {deals.map((deal, i) => (\n <DealCard key={deal.id || i} deal={deal} />\n ))}\n </div>\n );\n }\n }\n if (isPipedriveDeal(items)) {\n return <DealCard deal={items} />;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Terminal, AlertTriangle, Check, X } from \"lucide-react\";\n\ninterface ComputeData {\n stdout?: string;\n stderr?: string;\n exit_code?: number;\n exitCode?: number;\n duration?: number;\n duration_ms?: number;\n output?: string;\n error?: string;\n url?: string;\n files?: Array<{ name?: string; url?: string; size?: number }>;\n}\n\ninterface ComputeFormatterProps {\n data: unknown;\n}\n\nfunction isComputeData(data: unknown): data is ComputeData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"stdout\" in data || \"stderr\" in data || \"exit_code\" in data || \"exitCode\" in data || \"output\" in data;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${(ms / 60000).toFixed(1)}m`;\n}\n\nexport function ComputeFormatter({ data }: ComputeFormatterProps) {\n if (!isComputeData(data)) {\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n }\n\n const exitCode = data.exit_code ?? data.exitCode;\n const duration = data.duration_ms ?? data.duration;\n const stdout = data.stdout || data.output || \"\";\n const stderr = data.stderr || data.error || \"\";\n const success = exitCode === undefined || exitCode === 0;\n\n return (\n <div className=\"space-y-2\">\n <div className=\"rounded-lg border border-border bg-background overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center gap-2 px-3 py-1.5 bg-muted border-b border-border\">\n <Terminal className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground flex-1\">Output</span>\n <div className=\"flex items-center gap-2\">\n {duration !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{formatDuration(duration)}</span>\n )}\n {exitCode !== undefined && (\n <span className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs ${\n success ? \"text-green-500 bg-green-500/10\" : \"text-destructive bg-destructive/10\"\n }`}>\n {success ? <Check className=\"h-3 w-3\" /> : <X className=\"h-3 w-3\" />}\n exit {exitCode}\n </span>\n )}\n </div>\n </div>\n\n {/* Stdout */}\n {stdout && (\n <pre className=\"p-3 text-xs text-foreground overflow-x-auto max-h-80 overflow-y-auto font-mono whitespace-pre-wrap\">\n {stdout}\n </pre>\n )}\n\n {/* Stderr */}\n {stderr && (\n <div className=\"border-t border-border\">\n <div className=\"flex items-center gap-1.5 px-3 py-1 bg-destructive/5\">\n <AlertTriangle className=\"h-3 w-3 text-destructive\" />\n <span className=\"text-xs text-destructive\">stderr</span>\n </div>\n <pre className=\"p-3 text-xs text-destructive overflow-x-auto max-h-40 overflow-y-auto font-mono whitespace-pre-wrap\">\n {stderr}\n </pre>\n </div>\n )}\n\n {!stdout && !stderr && (\n <p className=\"p-3 text-xs text-muted-foreground italic\">No output</p>\n )}\n </div>\n\n {/* Output files */}\n {data.files && data.files.length > 0 && (\n <div className=\"space-y-1\">\n {data.files.map((file, i) => (\n <div key={i} className=\"flex items-center gap-2 rounded-lg border border-border bg-card p-2\">\n <Terminal className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n {file.url ? (\n <a href={file.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-xs text-primary hover:underline truncate\">\n {file.name || file.url}\n </a>\n ) : (\n <span className=\"text-xs text-foreground truncate\">{file.name}</span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { Send, Clock } from \"lucide-react\";\n\ninterface ResendEmailData {\n id?: string;\n to?: string | string[];\n from?: string;\n subject?: string;\n created_at?: string;\n last_event?: string;\n}\n\ninterface ResendFormatterProps {\n data: unknown;\n}\n\nfunction isResendData(data: unknown): data is ResendEmailData {\n return typeof data === \"object\" && data !== null && (\"id\" in data || \"to\" in data) && (\"subject\" in data || \"from\" in data || \"created_at\" in data);\n}\n\nfunction formatRecipients(to: string | string[] | undefined): string {\n if (!to) return \"Unknown\";\n if (Array.isArray(to)) return to.join(\", \");\n return to;\n}\n\nfunction formatTimestamp(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n return date.toLocaleString(undefined, { dateStyle: \"medium\", timeStyle: \"short\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction ResendCard({ email }: { email: ResendEmailData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-start gap-2\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-green-500/10 shrink-0\">\n <Send className=\"h-4 w-4 text-green-500\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">Email sent</p>\n {email.subject && (\n <p className=\"text-xs text-muted-foreground truncate\">{email.subject}</p>\n )}\n </div>\n </div>\n <div className=\"pl-10 space-y-1 text-xs text-muted-foreground\">\n <p>\n <span className=\"text-foreground\">To:</span> {formatRecipients(email.to)}\n </p>\n {email.from && (\n <p>\n <span className=\"text-foreground\">From:</span> {email.from}\n </p>\n )}\n {email.created_at && (\n <p className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {formatTimestamp(email.created_at)}\n </p>\n )}\n {email.last_event && (\n <span className=\"inline-block rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground capitalize\">\n {email.last_event}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport function ResendFormatter({ data }: ResendFormatterProps) {\n if (isResendData(data)) {\n return <ResendCard email={data} />;\n }\n\n if (typeof data === \"object\" && data !== null && \"data\" in data) {\n const inner = (data as any).data;\n if (isResendData(inner)) {\n return <ResendCard email={inner} />;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Bell, Calendar, Mail, MessageSquare } from \"lucide-react\";\n\ninterface InboxEventData {\n id?: string;\n /** Legacy fields */\n type?: string;\n title?: string;\n description?: string;\n source?: string;\n timestamp?: string;\n created_at?: string;\n read?: boolean;\n /** Actual API fields */\n event_type?: string;\n summary?: string;\n provider?: string;\n status?: string;\n received_at?: string;\n updated_at?: string;\n payload?: Record<string, unknown>;\n}\n\ninterface InboxFormatterProps {\n data: unknown;\n}\n\nfunction isInboxEvent(data: unknown): data is InboxEventData {\n if (typeof data !== \"object\" || data === null) return false;\n // Actual API shape\n if (\"event_type\" in data || \"summary\" in data) return true;\n // Legacy/mock shape\n if (\"title\" in data || (\"type\" in data && \"source\" in data)) return true;\n return false;\n}\n\nfunction resolveEventType(event: InboxEventData): string | undefined {\n if (event.event_type) {\n // \"email.received\" → \"email\", \"message\" → \"message\"\n return event.event_type.split(\".\")[0];\n }\n return event.type;\n}\n\nfunction getEventIcon(type?: string) {\n switch (type) {\n case \"email\":\n return Mail;\n case \"message\":\n return MessageSquare;\n case \"calendar\":\n return Calendar;\n default:\n return Bell;\n }\n}\n\nfunction formatTimestamp(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffHours < 1) return \"Just now\";\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction EventCard({ event }: { event: InboxEventData }) {\n const eventType = resolveEventType(event);\n const Icon = getEventIcon(eventType);\n const timestamp = event.received_at || event.timestamp || event.created_at;\n const title = event.summary || event.title;\n const source = event.provider || event.source;\n const snippet = event.description || (event.payload?.snippet as string) || (event.payload?.text as string);\n const isUnread = event.status === \"unread\" || event.read === false;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Icon className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n {eventType && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground capitalize\">\n {eventType}\n </span>\n )}\n {source && (\n <span className=\"text-xs text-muted-foreground capitalize\">{source}</span>\n )}\n {isUnread && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary shrink-0\" />\n )}\n {timestamp && (\n <span className=\"text-xs text-muted-foreground ml-auto shrink-0\">\n {formatTimestamp(timestamp)}\n </span>\n )}\n </div>\n {title && (\n <p className=\"text-sm font-medium text-foreground mt-1 line-clamp-1\">{title}</p>\n )}\n </div>\n </div>\n {snippet && (\n <p className=\"text-xs text-muted-foreground line-clamp-2 pl-6\">{snippet}</p>\n )}\n </div>\n );\n}\n\nexport function InboxFormatter({ data }: InboxFormatterProps) {\n if (isInboxEvent(data)) {\n return <EventCard event={data} />;\n }\n\n if (Array.isArray(data)) {\n const events = data.filter(isInboxEvent);\n if (events.length > 0) {\n return (\n <div className=\"space-y-2\">\n {events.map((event, i) => (\n <EventCard key={event.id || i} event={event} />\n ))}\n </div>\n );\n }\n }\n\n if (typeof data === \"object\" && data !== null && \"events\" in data) {\n const events = (data as any).events;\n if (Array.isArray(events)) {\n const inboxEvents = events.filter(isInboxEvent);\n if (inboxEvents.length > 0) {\n return (\n <div className=\"space-y-2\">\n {inboxEvents.map((event, i) => (\n <EventCard key={event.id || i} event={event} />\n ))}\n </div>\n );\n }\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { MessageSquare, Hash, Shield, Users } from \"lucide-react\";\n\ninterface GuildData {\n id?: string;\n name?: string;\n owner?: boolean;\n member_count?: number;\n icon?: string;\n}\n\ninterface ChannelData {\n id?: string;\n name?: string;\n type?: number;\n position?: number;\n member_count?: number;\n}\n\ninterface MessageData {\n id?: string;\n content?: string;\n author?: { username?: string; id?: string };\n timestamp?: string;\n channel_id?: string;\n}\n\ninterface DiscordFormatterProps {\n data: unknown;\n}\n\nfunction isGuildData(data: unknown): data is GuildData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"owner\" in data || \"member_count\" in data || \"icon\" in data);\n}\n\nfunction isChannelData(data: unknown): data is ChannelData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"type\" in data || \"position\" in data);\n}\n\nfunction isMessageData(data: unknown): data is MessageData {\n return typeof data === \"object\" && data !== null && (\"content\" in data || \"author\" in data) && \"id\" in data;\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction GuildCard({ guild }: { guild: GuildData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm font-medium text-foreground flex-1\">{guild.name}</span>\n {guild.owner && (\n <span className=\"rounded-full bg-yellow-500/10 px-2 py-0.5 text-xs text-yellow-600\">Owner</span>\n )}\n </div>\n {guild.member_count !== undefined && (\n <div className=\"flex items-center gap-1 pl-6 text-xs text-muted-foreground\">\n <Users className=\"h-3 w-3\" />\n {guild.member_count} members\n </div>\n )}\n </div>\n );\n}\n\nfunction ChannelCard({ channel }: { channel: ChannelData }) {\n return (\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-card p-3\">\n <Hash className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm text-foreground flex-1\">{channel.name || channel.id}</span>\n {channel.member_count !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{channel.member_count} members</span>\n )}\n </div>\n );\n}\n\nfunction MessageCard({ message }: { message: MessageData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {message.author?.username && (\n <span className=\"text-xs font-medium text-foreground\">{message.author.username}</span>\n )}\n {message.timestamp && (\n <span className=\"text-xs text-muted-foreground ml-auto\">{formatRelativeDate(message.timestamp)}</span>\n )}\n </div>\n {message.content && (\n <p className=\"text-sm text-foreground line-clamp-3\">{message.content}</p>\n )}\n </div>\n );\n}\n\nexport function DiscordFormatter({ data }: DiscordFormatterProps) {\n // Guilds\n if (typeof data === \"object\" && data !== null && \"guilds\" in data) {\n const guilds = (data as any).guilds;\n if (Array.isArray(guilds)) {\n return (\n <div className=\"space-y-1.5\">\n {guilds.filter(isGuildData).map((g, i) => <GuildCard key={g.id || i} guild={g} />)}\n </div>\n );\n }\n }\n\n // Channels\n if (typeof data === \"object\" && data !== null && \"channels\" in data) {\n const channels = (data as any).channels;\n if (Array.isArray(channels)) {\n return (\n <div className=\"space-y-1.5\">\n {channels.filter(isChannelData).map((c, i) => <ChannelCard key={c.id || i} channel={c} />)}\n </div>\n );\n }\n }\n\n // Messages\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const messages = (data as any).messages;\n if (Array.isArray(messages)) {\n return (\n <div className=\"space-y-2\">\n {messages.filter(isMessageData).map((m, i) => <MessageCard key={m.id || i} message={m} />)}\n </div>\n );\n }\n }\n\n // Single message\n if (isMessageData(data)) return <MessageCard message={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const guilds = data.filter(isGuildData);\n if (guilds.length > 0) {\n return (\n <div className=\"space-y-1.5\">{guilds.map((g, i) => <GuildCard key={g.id || i} guild={g} />)}</div>\n );\n }\n const messages = data.filter(isMessageData);\n if (messages.length > 0) {\n return (\n <div className=\"space-y-2\">{messages.map((m, i) => <MessageCard key={m.id || i} message={m} />)}</div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { FileText, Database, ExternalLink, Clock } from \"lucide-react\";\n\ninterface NotionPageData {\n id?: string;\n url?: string;\n last_edited_time?: string;\n lastEditedTime?: string;\n properties?: Record<string, unknown>;\n title?: string;\n}\n\ninterface NotionDatabaseData {\n id?: string;\n title?: string | Array<{ plain_text?: string }>;\n description?: string | Array<{ plain_text?: string }>;\n url?: string;\n lastEditedTime?: string;\n}\n\ninterface NotionFormatterProps {\n data: unknown;\n}\n\nfunction isNotionPage(data: unknown): data is NotionPageData {\n if (typeof data !== \"object\" || data === null) return false;\n // Raw Notion shape with properties\n if (\"properties\" in data) return true;\n // Notion URL-based detection\n if (\"id\" in data && \"url\" in data && String((data as any).url || \"\").includes(\"notion\")) return true;\n // Normalized Supyagent shape: has title + id + parentType (distinguishes from database)\n if (\"title\" in data && \"id\" in data && \"parentType\" in data) return true;\n return false;\n}\n\nfunction isNotionDatabase(data: unknown): data is NotionDatabaseData {\n if (typeof data !== \"object\" || data === null) return false;\n // Raw Notion shape: title is an array\n if (\"title\" in data && Array.isArray((data as any).title) && \"id\" in data) return true;\n // Normalized Supyagent shape: has propertyCount (distinguishes from pages)\n if (\"title\" in data && \"id\" in data && \"propertyCount\" in data) return true;\n return false;\n}\n\nfunction extractPageTitle(page: NotionPageData): string {\n if (page.title) return page.title;\n if (page.properties) {\n for (const val of Object.values(page.properties)) {\n if (typeof val === \"object\" && val !== null && \"title\" in val) {\n const titles = (val as any).title;\n if (Array.isArray(titles) && titles.length > 0) {\n return titles.map((t: any) => t.plain_text || t.text?.content || \"\").join(\"\");\n }\n }\n }\n // Check Name property (common)\n const name = page.properties.Name || page.properties.name;\n if (typeof name === \"object\" && name !== null && \"title\" in name) {\n const titles = (name as any).title;\n if (Array.isArray(titles) && titles.length > 0) {\n return titles.map((t: any) => t.plain_text || \"\").join(\"\");\n }\n }\n }\n return \"Untitled\";\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0) return \"today\";\n if (diffDays === 1) return \"yesterday\";\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction PageCard({ page }: { page: NotionPageData }) {\n const title = extractPageTitle(page);\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <FileText className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {page.url ? (\n <a href={page.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {title}\n </a>\n ) : (\n title\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {(page.last_edited_time || page.lastEditedTime) && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate((page.last_edited_time || page.lastEditedTime)!)}\n </span>\n )}\n {page.url && (\n <a href={page.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-muted-foreground hover:text-foreground\">\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction DatabaseCard({ db }: { db: NotionDatabaseData }) {\n const title = typeof db.title === \"string\"\n ? db.title\n : Array.isArray(db.title) && db.title.length > 0\n ? db.title.map((t) => t.plain_text || \"\").join(\"\")\n : \"Untitled database\";\n const desc = typeof db.description === \"string\"\n ? db.description\n : Array.isArray(db.description) && db.description.length > 0\n ? db.description.map((d) => d.plain_text || \"\").join(\"\")\n : null;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <Database className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground truncate\">\n {db.url ? (\n <a href={db.url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"hover:underline\">\n {title}\n </a>\n ) : (\n title\n )}\n </p>\n {desc && <p className=\"text-xs text-muted-foreground line-clamp-2\">{desc}</p>}\n </div>\n </div>\n </div>\n );\n}\n\nexport function NotionFormatter({ data }: NotionFormatterProps) {\n // Pages array\n if (typeof data === \"object\" && data !== null && \"pages\" in data) {\n const pages = (data as any).pages;\n if (Array.isArray(pages)) {\n return (\n <div className=\"space-y-1.5\">\n {pages.filter(isNotionPage).map((p, i) => <PageCard key={p.id || i} page={p} />)}\n </div>\n );\n }\n }\n\n // Databases array\n if (typeof data === \"object\" && data !== null && \"databases\" in data) {\n const dbs = (data as any).databases;\n if (Array.isArray(dbs)) {\n return (\n <div className=\"space-y-1.5\">\n {dbs.filter(isNotionDatabase).map((d, i) => <DatabaseCard key={d.id || i} db={d} />)}\n </div>\n );\n }\n }\n\n // Results array (query response)\n if (typeof data === \"object\" && data !== null && \"results\" in data) {\n const results = (data as any).results;\n if (Array.isArray(results)) {\n const pages = results.filter(isNotionPage);\n if (pages.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {pages.map((p, i) => <PageCard key={p.id || i} page={p} />)}\n </div>\n );\n }\n const dbs = results.filter(isNotionDatabase);\n if (dbs.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {dbs.map((d, i) => <DatabaseCard key={d.id || i} db={d} />)}\n </div>\n );\n }\n }\n }\n\n // Single page\n if (isNotionPage(data)) return <PageCard page={data} />;\n\n // Single database\n if (isNotionDatabase(data)) return <DatabaseCard db={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const pages = data.filter(isNotionPage);\n if (pages.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {pages.map((p, i) => <PageCard key={p.id || i} page={p} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { MessageCircle, Heart, Repeat2, Clock } from \"lucide-react\";\n\ninterface TweetData {\n id?: string;\n text?: string;\n author_username?: string;\n username?: string;\n author?: { username?: string; name?: string };\n created_at?: string;\n public_metrics?: {\n like_count?: number;\n retweet_count?: number;\n reply_count?: number;\n };\n like_count?: number;\n retweet_count?: number;\n}\n\ninterface TwitterFormatterProps {\n data: unknown;\n}\n\nfunction isTweetData(data: unknown): data is TweetData {\n return typeof data === \"object\" && data !== null && \"text\" in data;\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nfunction TweetCard({ tweet }: { tweet: TweetData }) {\n const username = tweet.author_username || tweet.username || tweet.author?.username;\n const likes = tweet.public_metrics?.like_count ?? tweet.like_count;\n const retweets = tweet.public_metrics?.retweet_count ?? tweet.retweet_count;\n const replies = tweet.public_metrics?.reply_count;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MessageCircle className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {username && (\n <span className=\"text-xs font-medium text-foreground\">@{username}</span>\n )}\n {tweet.author?.name && (\n <span className=\"text-xs text-muted-foreground\">{tweet.author.name}</span>\n )}\n {tweet.created_at && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground ml-auto\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate(tweet.created_at)}\n </span>\n )}\n </div>\n {tweet.text && (\n <p className=\"text-sm text-foreground line-clamp-4\">{tweet.text}</p>\n )}\n {(likes !== undefined || retweets !== undefined || replies !== undefined) && (\n <div className=\"flex items-center gap-4 pt-0.5\">\n {likes !== undefined && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Heart className=\"h-3 w-3\" />\n {likes}\n </span>\n )}\n {retweets !== undefined && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Repeat2 className=\"h-3 w-3\" />\n {retweets}\n </span>\n )}\n {replies !== undefined && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <MessageCircle className=\"h-3 w-3\" />\n {replies}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function TwitterFormatter({ data }: TwitterFormatterProps) {\n // {tweets: [...]}\n if (typeof data === \"object\" && data !== null && \"tweets\" in data) {\n const tweets = (data as any).tweets;\n if (Array.isArray(tweets)) {\n return (\n <div className=\"space-y-2\">\n {tweets.filter(isTweetData).map((t, i) => <TweetCard key={t.id || i} tweet={t} />)}\n </div>\n );\n }\n }\n\n // {data: [...]} (Twitter API v2 shape)\n if (typeof data === \"object\" && data !== null && \"data\" in data && Array.isArray((data as any).data)) {\n const tweets = (data as any).data;\n return (\n <div className=\"space-y-2\">\n {tweets.filter(isTweetData).map((t: TweetData, i: number) => <TweetCard key={t.id || i} tweet={t} />)}\n </div>\n );\n }\n\n if (isTweetData(data)) return <TweetCard tweet={data} />;\n\n if (Array.isArray(data)) {\n const tweets = data.filter(isTweetData);\n if (tweets.length > 0) {\n return (\n <div className=\"space-y-2\">\n {tweets.map((t, i) => <TweetCard key={t.id || i} tweet={t} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { MessageSquare, User, Clock } from \"lucide-react\";\n\ninterface TelegramMessageData {\n message_id?: number;\n text?: string;\n from?: { username?: string; first_name?: string; last_name?: string };\n chat?: { title?: string; username?: string; type?: string };\n date?: number;\n}\n\ninterface TelegramFormatterProps {\n data: unknown;\n}\n\nfunction isTelegramMessage(data: unknown): data is TelegramMessageData {\n return typeof data === \"object\" && data !== null && (\"text\" in data || \"message_id\" in data);\n}\n\nfunction formatUnixDate(ts: number): string {\n try {\n const date = new Date(ts * 1000);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return String(ts);\n }\n}\n\nfunction MessageCard({ message }: { message: TelegramMessageData }) {\n const fromName = message.from\n ? [message.from.first_name, message.from.last_name].filter(Boolean).join(\" \") || message.from.username\n : undefined;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {fromName && (\n <span className=\"flex items-center gap-1 text-xs font-medium text-foreground\">\n <User className=\"h-3 w-3\" />\n {fromName}\n </span>\n )}\n {message.chat?.title && (\n <span className=\"text-xs text-muted-foreground\">{message.chat.title}</span>\n )}\n {message.date && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground ml-auto\">\n <Clock className=\"h-3 w-3\" />\n {formatUnixDate(message.date)}\n </span>\n )}\n </div>\n {message.text && (\n <p className=\"text-sm text-foreground line-clamp-3\">{message.text}</p>\n )}\n </div>\n );\n}\n\nexport function TelegramFormatter({ data }: TelegramFormatterProps) {\n // {messages: [...]}\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const msgs = (data as any).messages;\n if (Array.isArray(msgs)) {\n return (\n <div className=\"space-y-2\">\n {msgs.filter(isTelegramMessage).map((m, i) => <MessageCard key={m.message_id || i} message={m} />)}\n </div>\n );\n }\n }\n\n // {result: [...]} (Bot API shape)\n if (typeof data === \"object\" && data !== null && \"result\" in data) {\n const result = (data as any).result;\n if (Array.isArray(result)) {\n const msgs = result.filter(isTelegramMessage);\n if (msgs.length > 0) {\n return (\n <div className=\"space-y-2\">\n {msgs.map((m, i) => <MessageCard key={m.message_id || i} message={m} />)}\n </div>\n );\n }\n }\n }\n\n if (isTelegramMessage(data)) return <MessageCard message={data} />;\n\n if (Array.isArray(data)) {\n const msgs = data.filter(isTelegramMessage);\n if (msgs.length > 0) {\n return (\n <div className=\"space-y-2\">\n {msgs.map((m, i) => <MessageCard key={m.message_id || i} message={m} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { CreditCard, User, FileText, Clock, RefreshCw } from \"lucide-react\";\n\ninterface StripeCustomerData {\n id?: string;\n name?: string;\n email?: string;\n phone?: string;\n created?: number;\n}\n\ninterface StripeInvoiceData {\n id?: string;\n number?: string;\n amount_due?: number;\n amount_paid?: number;\n currency?: string;\n status?: string;\n customer_name?: string;\n due_date?: number;\n}\n\ninterface StripeSubscriptionData {\n id?: string;\n status?: string;\n plan?: { nickname?: string; amount?: number; currency?: string; interval?: string };\n current_period_start?: number;\n current_period_end?: number;\n}\n\ninterface StripeBalanceData {\n available?: Array<{ amount: number; currency: string }>;\n pending?: Array<{ amount: number; currency: string }>;\n}\n\ninterface StripeFormatterProps {\n data: unknown;\n}\n\nfunction isCustomer(data: unknown): data is StripeCustomerData {\n return typeof data === \"object\" && data !== null && (\"email\" in data || \"name\" in data) && !(\"amount_due\" in data) && !(\"plan\" in data);\n}\n\nfunction isInvoice(data: unknown): data is StripeInvoiceData {\n return typeof data === \"object\" && data !== null && (\"number\" in data || \"amount_due\" in data);\n}\n\nfunction isSubscription(data: unknown): data is StripeSubscriptionData {\n return typeof data === \"object\" && data !== null && \"plan\" in data && \"status\" in data;\n}\n\nfunction isBalance(data: unknown): data is StripeBalanceData {\n return typeof data === \"object\" && data !== null && (\"available\" in data || \"pending\" in data);\n}\n\nfunction formatAmount(amount: number, currency: string): string {\n try {\n return new Intl.NumberFormat(undefined, { style: \"currency\", currency: currency.toUpperCase() }).format(amount / 100);\n } catch {\n return `${(amount / 100).toFixed(2)} ${currency.toUpperCase()}`;\n }\n}\n\nfunction formatUnixDate(ts: number): string {\n try {\n return new Date(ts * 1000).toLocaleDateString(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" });\n } catch {\n return String(ts);\n }\n}\n\nconst STATUS_STYLES: Record<string, string> = {\n paid: \"bg-green-500/10 text-green-500\",\n active: \"bg-green-500/10 text-green-500\",\n open: \"bg-blue-500/10 text-blue-500\",\n draft: \"bg-muted text-muted-foreground\",\n void: \"bg-muted text-muted-foreground\",\n uncollectible: \"bg-destructive/10 text-destructive\",\n past_due: \"bg-destructive/10 text-destructive\",\n canceled: \"bg-destructive/10 text-destructive\",\n trialing: \"bg-yellow-500/10 text-yellow-600\",\n};\n\nfunction StatusBadge({ status }: { status: string }) {\n return (\n <span className={`rounded-full px-2 py-0.5 text-xs ${STATUS_STYLES[status] || \"bg-muted text-muted-foreground\"}`}>\n {status}\n </span>\n );\n}\n\nfunction CustomerCard({ customer }: { customer: StripeCustomerData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{customer.name || \"Unnamed customer\"}</p>\n {customer.email && <p className=\"text-xs text-muted-foreground\">{customer.email}</p>}\n </div>\n </div>\n </div>\n );\n}\n\nfunction InvoiceCard({ invoice }: { invoice: StripeInvoiceData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <FileText className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{invoice.number || invoice.id}</p>\n {invoice.customer_name && <p className=\"text-xs text-muted-foreground\">{invoice.customer_name}</p>}\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {invoice.amount_due !== undefined && invoice.currency && (\n <span className=\"text-sm font-medium text-foreground\">{formatAmount(invoice.amount_due, invoice.currency)}</span>\n )}\n {invoice.status && <StatusBadge status={invoice.status} />}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SubscriptionCard({ sub }: { sub: StripeSubscriptionData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <RefreshCw className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {sub.plan?.nickname || \"Subscription\"}\n {sub.plan?.amount !== undefined && sub.plan?.currency && (\n <span className=\"text-muted-foreground font-normal\"> {formatAmount(sub.plan.amount, sub.plan.currency)}/{sub.plan.interval}</span>\n )}\n </p>\n {sub.current_period_end && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n Renews {formatUnixDate(sub.current_period_end)}\n </p>\n )}\n </div>\n {sub.status && <StatusBadge status={sub.status} />}\n </div>\n </div>\n );\n}\n\nfunction BalanceDisplay({ balance }: { balance: StripeBalanceData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <CreditCard className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm font-medium text-foreground\">Balance</span>\n </div>\n <div className=\"grid grid-cols-2 gap-4 pl-6\">\n {balance.available && balance.available.length > 0 && (\n <div>\n <p className=\"text-xs text-muted-foreground\">Available</p>\n {balance.available.map((b, i) => (\n <p key={i} className=\"text-sm font-medium text-foreground\">{formatAmount(b.amount, b.currency)}</p>\n ))}\n </div>\n )}\n {balance.pending && balance.pending.length > 0 && (\n <div>\n <p className=\"text-xs text-muted-foreground\">Pending</p>\n {balance.pending.map((b, i) => (\n <p key={i} className=\"text-sm font-medium text-foreground\">{formatAmount(b.amount, b.currency)}</p>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function StripeFormatter({ data }: StripeFormatterProps) {\n // Balance\n if (isBalance(data)) return <BalanceDisplay balance={data} />;\n\n // List response {data: [...]}\n if (typeof data === \"object\" && data !== null && \"data\" in data && Array.isArray((data as any).data)) {\n const items = (data as any).data as unknown[];\n const invoices = items.filter(isInvoice);\n if (invoices.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {invoices.map((inv, i) => <InvoiceCard key={inv.id || i} invoice={inv} />)}\n </div>\n );\n }\n const subs = items.filter(isSubscription);\n if (subs.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {subs.map((s, i) => <SubscriptionCard key={s.id || i} sub={s} />)}\n </div>\n );\n }\n const customers = items.filter(isCustomer);\n if (customers.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {customers.map((c, i) => <CustomerCard key={c.id || i} customer={c} />)}\n </div>\n );\n }\n }\n\n // Single items\n if (isInvoice(data)) return <InvoiceCard invoice={data} />;\n if (isSubscription(data)) return <SubscriptionCard sub={data} />;\n if (isCustomer(data)) return <CustomerCard customer={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const invoices = data.filter(isInvoice);\n if (invoices.length > 0) {\n return <div className=\"space-y-1.5\">{invoices.map((inv, i) => <InvoiceCard key={inv.id || i} invoice={inv} />)}</div>;\n }\n const customers = data.filter(isCustomer);\n if (customers.length > 0) {\n return <div className=\"space-y-1.5\">{customers.map((c, i) => <CustomerCard key={c.id || i} customer={c} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { CircleDot, SquareKanban, User, ArrowUp, ArrowDown, Minus } from \"lucide-react\";\n\ninterface JiraIssueData {\n key?: string;\n id?: string;\n self?: string;\n fields?: {\n summary?: string;\n status?: { name?: string; statusCategory?: { colorName?: string; key?: string } };\n priority?: { name?: string; id?: string };\n assignee?: { displayName?: string; name?: string };\n issuetype?: { name?: string };\n created?: string;\n };\n}\n\ninterface JiraProjectData {\n key?: string;\n id?: string;\n name?: string;\n projectTypeKey?: string;\n self?: string;\n}\n\ninterface JiraFormatterProps {\n data: unknown;\n}\n\nfunction isJiraIssue(data: unknown): data is JiraIssueData {\n return typeof data === \"object\" && data !== null && \"key\" in data && \"fields\" in data;\n}\n\nfunction isJiraProject(data: unknown): data is JiraProjectData {\n return typeof data === \"object\" && data !== null && \"key\" in data && \"name\" in data && \"projectTypeKey\" in data;\n}\n\nconst STATUS_COLORS: Record<string, string> = {\n blue: \"bg-blue-500\",\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n \"blue-gray\": \"bg-slate-400\",\n undefined: \"bg-muted-foreground\",\n};\n\nfunction PriorityIcon({ name }: { name?: string }) {\n const lower = (name || \"\").toLowerCase();\n if (lower === \"highest\" || lower === \"critical\") return <ArrowUp className=\"h-3 w-3 text-destructive\" />;\n if (lower === \"high\") return <ArrowUp className=\"h-3 w-3 text-orange-500\" />;\n if (lower === \"low\") return <ArrowDown className=\"h-3 w-3 text-blue-500\" />;\n if (lower === \"lowest\") return <ArrowDown className=\"h-3 w-3 text-green-500\" />;\n return <Minus className=\"h-3 w-3 text-muted-foreground\" />;\n}\n\nfunction IssueCard({ issue }: { issue: JiraIssueData }) {\n const f = issue.fields || {};\n const statusColor = f.status?.statusCategory?.colorName || \"undefined\";\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <CircleDot className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n <span className=\"text-muted-foreground font-normal\">{issue.key}</span>{\" \"}\n {f.summary}\n </p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {f.status?.name && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <span className={`h-1.5 w-1.5 rounded-full ${STATUS_COLORS[statusColor] || STATUS_COLORS.undefined}`} />\n {f.status.name}\n </span>\n )}\n {f.priority?.name && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <PriorityIcon name={f.priority.name} />\n {f.priority.name}\n </span>\n )}\n {f.issuetype?.name && (\n <span className=\"text-xs text-muted-foreground\">{f.issuetype.name}</span>\n )}\n {f.assignee && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <User className=\"h-3 w-3\" />\n {f.assignee.displayName || f.assignee.name}\n </span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ProjectCard({ project }: { project: JiraProjectData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <SquareKanban className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">\n <span className=\"text-muted-foreground font-normal\">{project.key}</span>{\" \"}\n {project.name}\n </p>\n {project.projectTypeKey && (\n <p className=\"text-xs text-muted-foreground\">{project.projectTypeKey}</p>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport function JiraFormatter({ data }: JiraFormatterProps) {\n // {issues: [...]}\n if (typeof data === \"object\" && data !== null && \"issues\" in data) {\n const issues = (data as any).issues;\n if (Array.isArray(issues)) {\n return (\n <div className=\"space-y-1.5\">\n {issues.filter(isJiraIssue).map((iss, i) => <IssueCard key={iss.key || i} issue={iss} />)}\n </div>\n );\n }\n }\n\n // {projects: [...]}\n if (typeof data === \"object\" && data !== null && \"projects\" in data) {\n const projects = (data as any).projects;\n if (Array.isArray(projects)) {\n return (\n <div className=\"space-y-1.5\">\n {projects.filter(isJiraProject).map((p, i) => <ProjectCard key={p.key || i} project={p} />)}\n </div>\n );\n }\n }\n\n // Single issue\n if (isJiraIssue(data)) return <IssueCard issue={data} />;\n\n // Single project\n if (isJiraProject(data)) return <ProjectCard project={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const issues = data.filter(isJiraIssue);\n if (issues.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {issues.map((iss, i) => <IssueCard key={iss.key || i} issue={iss} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { User, Briefcase, Mail, Phone, Building2, Calendar } from \"lucide-react\";\n\ninterface SalesforceContactData {\n Id?: string;\n Name?: string;\n Title?: string;\n Email?: string;\n Phone?: string;\n Account?: { Name?: string } | null;\n AccountName?: string;\n}\n\ninterface SalesforceOpportunityData {\n Id?: string;\n Name?: string;\n Amount?: number;\n StageName?: string;\n CloseDate?: string;\n Probability?: number;\n}\n\ninterface SalesforceFormatterProps {\n data: unknown;\n}\n\nfunction isContact(data: unknown): data is SalesforceContactData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"Name\" in data && (\"Email\" in data || \"Phone\" in data || \"Title\" in data);\n}\n\nfunction isOpportunity(data: unknown): data is SalesforceOpportunityData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"Name\" in data && (\"StageName\" in data || \"Amount\" in data || \"CloseDate\" in data);\n}\n\nfunction ContactCard({ contact }: { contact: SalesforceContactData }) {\n const account = contact.AccountName || contact.Account?.Name;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{contact.Name}</p>\n {contact.Title && <p className=\"text-xs text-muted-foreground\">{contact.Title}</p>}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-x-4 gap-y-1 pl-6\">\n {contact.Email && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Mail className=\"h-3 w-3\" />\n {contact.Email}\n </span>\n )}\n {contact.Phone && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Phone className=\"h-3 w-3\" />\n {contact.Phone}\n </span>\n )}\n {account && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Building2 className=\"h-3 w-3\" />\n {account}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction OpportunityCard({ opp }: { opp: SalesforceOpportunityData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Briefcase className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{opp.Name}</p>\n <div className=\"flex items-center gap-2 mt-0.5 flex-wrap\">\n {opp.Amount !== undefined && (\n <span className=\"text-xs font-medium text-foreground\">\n {new Intl.NumberFormat(undefined, { style: \"currency\", currency: \"USD\" }).format(opp.Amount)}\n </span>\n )}\n {opp.StageName && (\n <span className=\"rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground\">\n {opp.StageName}\n </span>\n )}\n {opp.CloseDate && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Calendar className=\"h-3 w-3\" />\n {opp.CloseDate}\n </span>\n )}\n </div>\n </div>\n </div>\n {opp.Probability !== undefined && (\n <div className=\"pl-6 space-y-0.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">Probability</span>\n <span className=\"text-xs font-medium text-foreground\">{opp.Probability}%</span>\n </div>\n <div className=\"h-1.5 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${Math.min(100, opp.Probability)}%` }}\n />\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport function SalesforceFormatter({ data }: SalesforceFormatterProps) {\n // {records: [...]}\n if (typeof data === \"object\" && data !== null && \"records\" in data) {\n const records = (data as any).records;\n if (Array.isArray(records)) {\n const contacts = records.filter(isContact);\n const opps = records.filter(isOpportunity);\n if (opps.length > 0 && contacts.length === 0) {\n return (\n <div className=\"space-y-1.5\">\n {opps.map((o, i) => <OpportunityCard key={o.Id || i} opp={o} />)}\n </div>\n );\n }\n if (contacts.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {contacts.map((c, i) => <ContactCard key={c.Id || i} contact={c} />)}\n </div>\n );\n }\n }\n }\n\n // Single\n if (isOpportunity(data)) return <OpportunityCard opp={data} />;\n if (isContact(data)) return <ContactCard contact={data} />;\n\n // Array\n if (Array.isArray(data)) {\n const contacts = data.filter(isContact);\n if (contacts.length > 0) {\n return <div className=\"space-y-1.5\">{contacts.map((c, i) => <ContactCard key={c.Id || i} contact={c} />)}</div>;\n }\n const opps = data.filter(isOpportunity);\n if (opps.length > 0) {\n return <div className=\"space-y-1.5\">{opps.map((o, i) => <OpportunityCard key={o.Id || i} opp={o} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { User, Mail, BarChart3 } from \"lucide-react\";\n\ninterface BrevoContactData {\n id?: number;\n email?: string;\n attributes?: { FIRSTNAME?: string; LASTNAME?: string; [key: string]: unknown };\n}\n\ninterface BrevoCampaignData {\n id?: number;\n name?: string;\n subject?: string;\n status?: string;\n statistics?: {\n globalStats?: { opened?: number; clicked?: number; sent?: number };\n };\n}\n\ninterface BrevoFormatterProps {\n data: unknown;\n}\n\nfunction isBrevoContact(data: unknown): data is BrevoContactData {\n return typeof data === \"object\" && data !== null && \"email\" in data && (\"attributes\" in data || \"id\" in data);\n}\n\nfunction isBrevoCampaign(data: unknown): data is BrevoCampaignData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"subject\" in data || \"status\" in data);\n}\n\nconst STATUS_STYLES: Record<string, string> = {\n sent: \"bg-green-500/10 text-green-500\",\n draft: \"bg-muted text-muted-foreground\",\n queued: \"bg-blue-500/10 text-blue-500\",\n suspended: \"bg-yellow-500/10 text-yellow-600\",\n archive: \"bg-muted text-muted-foreground\",\n};\n\nfunction ContactCard({ contact }: { contact: BrevoContactData }) {\n const name = contact.attributes\n ? [contact.attributes.FIRSTNAME, contact.attributes.LASTNAME].filter(Boolean).join(\" \")\n : undefined;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n {name && <p className=\"text-sm font-medium text-foreground\">{name}</p>}\n <p className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <Mail className=\"h-3 w-3\" />\n {contact.email}\n </p>\n </div>\n </div>\n </div>\n );\n}\n\nfunction CampaignCard({ campaign }: { campaign: BrevoCampaignData }) {\n const stats = campaign.statistics?.globalStats;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-start gap-2\">\n <Mail className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{campaign.name}</p>\n {campaign.subject && <p className=\"text-xs text-muted-foreground\">{campaign.subject}</p>}\n </div>\n {campaign.status && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${STATUS_STYLES[campaign.status] || \"bg-muted text-muted-foreground\"}`}>\n {campaign.status}\n </span>\n )}\n </div>\n {stats && (\n <div className=\"flex items-center gap-4 pl-6\">\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <BarChart3 className=\"h-3 w-3\" />\n {stats.sent ?? 0} sent\n </span>\n {stats.opened !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{stats.opened} opened</span>\n )}\n {stats.clicked !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{stats.clicked} clicked</span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function BrevoFormatter({ data }: BrevoFormatterProps) {\n // {contacts: [...]}\n if (typeof data === \"object\" && data !== null && \"contacts\" in data) {\n const contacts = (data as any).contacts;\n if (Array.isArray(contacts)) {\n return (\n <div className=\"space-y-1.5\">\n {contacts.filter(isBrevoContact).map((c, i) => <ContactCard key={c.id || i} contact={c} />)}\n </div>\n );\n }\n }\n\n // {campaigns: [...]}\n if (typeof data === \"object\" && data !== null && \"campaigns\" in data) {\n const campaigns = (data as any).campaigns;\n if (Array.isArray(campaigns)) {\n return (\n <div className=\"space-y-1.5\">\n {campaigns.filter(isBrevoCampaign).map((c, i) => <CampaignCard key={c.id || i} campaign={c} />)}\n </div>\n );\n }\n }\n\n if (isBrevoContact(data)) return <ContactCard contact={data} />;\n if (isBrevoCampaign(data)) return <CampaignCard campaign={data} />;\n\n if (Array.isArray(data)) {\n const contacts = data.filter(isBrevoContact);\n if (contacts.length > 0) {\n return <div className=\"space-y-1.5\">{contacts.map((c, i) => <ContactCard key={c.id || i} contact={c} />)}</div>;\n }\n const campaigns = data.filter(isBrevoCampaign);\n if (campaigns.length > 0) {\n return <div className=\"space-y-1.5\">{campaigns.map((c, i) => <CampaignCard key={c.id || i} campaign={c} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Calendar, Clock, MapPin } from \"lucide-react\";\n\ninterface CalendlyEventData {\n uri?: string;\n name?: string;\n status?: string;\n start_time?: string;\n end_time?: string;\n location?: { type?: string; location?: string };\n event_type?: string;\n}\n\ninterface CalendlyEventTypeData {\n uri?: string;\n name?: string;\n duration?: number;\n active?: boolean;\n slug?: string;\n description_plain?: string;\n}\n\ninterface CalendlyFormatterProps {\n data: unknown;\n}\n\nfunction isCalendlyEvent(data: unknown): data is CalendlyEventData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"start_time\" in data || \"status\" in data);\n}\n\nfunction isCalendlyEventType(data: unknown): data is CalendlyEventTypeData {\n return typeof data === \"object\" && data !== null && \"name\" in data && (\"duration\" in data || \"slug\" in data || \"active\" in data);\n}\n\nfunction formatDateTime(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n } catch {\n return dateStr;\n }\n}\n\nconst STATUS_STYLES: Record<string, string> = {\n active: \"bg-green-500/10 text-green-500\",\n canceled: \"bg-destructive/10 text-destructive\",\n};\n\nfunction EventCard({ event }: { event: CalendlyEventData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{event.name}</p>\n {event.start_time && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatDateTime(event.start_time)}\n {event.end_time && ` - ${formatDateTime(event.end_time)}`}\n </p>\n )}\n {event.location?.location && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <MapPin className=\"h-3 w-3\" />\n {event.location.location}\n </p>\n )}\n </div>\n {event.status && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${STATUS_STYLES[event.status] || \"bg-muted text-muted-foreground\"}`}>\n {event.status}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction EventTypeCard({ eventType }: { eventType: CalendlyEventTypeData }) {\n return (\n <div className=\"rounded-lg border border-border bg-card p-3\">\n <div className=\"flex items-start gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{eventType.name}</p>\n {eventType.description_plain && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{eventType.description_plain}</p>\n )}\n {eventType.duration !== undefined && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {eventType.duration} min\n </p>\n )}\n </div>\n {eventType.active !== undefined && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${eventType.active ? \"bg-green-500/10 text-green-500\" : \"bg-muted text-muted-foreground\"}`}>\n {eventType.active ? \"Active\" : \"Inactive\"}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport function CalendlyFormatter({ data }: CalendlyFormatterProps) {\n if (typeof data === \"object\" && data !== null) {\n const d = data as Record<string, unknown>;\n\n // {collection: [...]}\n if (Array.isArray(d.collection)) {\n const events = d.collection.filter(isCalendlyEvent);\n const types = d.collection.filter(isCalendlyEventType);\n if (types.length > 0 && events.length === 0) {\n return <div className=\"space-y-1.5\">{types.map((t, i) => <EventTypeCard key={t.uri || i} eventType={t} />)}</div>;\n }\n if (events.length > 0) {\n return <div className=\"space-y-1.5\">{events.map((e, i) => <EventCard key={e.uri || i} event={e} />)}</div>;\n }\n }\n\n // {scheduled_events: [...]}\n if (Array.isArray(d.scheduled_events)) {\n return (\n <div className=\"space-y-1.5\">\n {d.scheduled_events.filter(isCalendlyEvent).map((e: CalendlyEventData, i: number) => <EventCard key={e.uri || i} event={e} />)}\n </div>\n );\n }\n\n // {event_types: [...]}\n if (Array.isArray(d.event_types)) {\n return (\n <div className=\"space-y-1.5\">\n {d.event_types.filter(isCalendlyEventType).map((t: CalendlyEventTypeData, i: number) => <EventTypeCard key={t.uri || i} eventType={t} />)}\n </div>\n );\n }\n }\n\n if (isCalendlyEvent(data)) return <EventCard event={data} />;\n if (isCalendlyEventType(data)) return <EventTypeCard eventType={data} />;\n\n if (Array.isArray(data)) {\n const events = data.filter(isCalendlyEvent);\n if (events.length > 0) {\n return <div className=\"space-y-1.5\">{events.map((e, i) => <EventCard key={e.uri || i} event={e} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { Phone, ArrowUpRight, ArrowDownLeft, Clock } from \"lucide-react\";\n\ninterface TwilioMessageData {\n sid?: string;\n from?: string;\n to?: string;\n body?: string;\n status?: string;\n direction?: string;\n date_sent?: string;\n date_created?: string;\n}\n\ninterface TwilioFormatterProps {\n data: unknown;\n}\n\nfunction isTwilioMessage(data: unknown): data is TwilioMessageData {\n return typeof data === \"object\" && data !== null && (\"body\" in data || \"sid\" in data) && (\"from\" in data || \"to\" in data);\n}\n\nfunction formatRelativeDate(dateStr: string): string {\n try {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return dateStr;\n }\n}\n\nconst STATUS_STYLES: Record<string, string> = {\n delivered: \"bg-green-500/10 text-green-500\",\n sent: \"bg-green-500/10 text-green-500\",\n received: \"bg-blue-500/10 text-blue-500\",\n failed: \"bg-destructive/10 text-destructive\",\n undelivered: \"bg-destructive/10 text-destructive\",\n queued: \"bg-yellow-500/10 text-yellow-600\",\n sending: \"bg-blue-500/10 text-blue-500\",\n};\n\nfunction MessageCard({ message }: { message: TwilioMessageData }) {\n const isInbound = message.direction?.includes(\"inbound\");\n const DirectionIcon = isInbound ? ArrowDownLeft : ArrowUpRight;\n const dateStr = message.date_sent || message.date_created;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <Phone className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <DirectionIcon className=\"h-3 w-3 text-muted-foreground shrink-0\" />\n <div className=\"flex items-center gap-1.5 flex-1 min-w-0\">\n {message.from && <span className=\"text-xs text-muted-foreground\">{message.from}</span>}\n <span className=\"text-xs text-muted-foreground\">→</span>\n {message.to && <span className=\"text-xs text-muted-foreground\">{message.to}</span>}\n </div>\n <div className=\"flex items-center gap-1.5 shrink-0\">\n {message.status && (\n <span className={`rounded-full px-2 py-0.5 text-xs ${STATUS_STYLES[message.status] || \"bg-muted text-muted-foreground\"}`}>\n {message.status}\n </span>\n )}\n {dateStr && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate(dateStr)}\n </span>\n )}\n </div>\n </div>\n {message.body && (\n <p className=\"text-sm text-foreground line-clamp-3\">{message.body}</p>\n )}\n </div>\n );\n}\n\nexport function TwilioFormatter({ data }: TwilioFormatterProps) {\n // {messages: [...]}\n if (typeof data === \"object\" && data !== null && \"messages\" in data) {\n const msgs = (data as any).messages;\n if (Array.isArray(msgs)) {\n return (\n <div className=\"space-y-1.5\">\n {msgs.filter(isTwilioMessage).map((m, i) => <MessageCard key={m.sid || i} message={m} />)}\n </div>\n );\n }\n }\n\n if (isTwilioMessage(data)) return <MessageCard message={data} />;\n\n if (Array.isArray(data)) {\n const msgs = data.filter(isTwilioMessage);\n if (msgs.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {msgs.map((m, i) => <MessageCard key={m.sid || i} message={m} />)}\n </div>\n );\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { User, FileText, ExternalLink, Clock } from \"lucide-react\";\n\ninterface LinkedInProfileData {\n id?: string;\n localizedFirstName?: string;\n localizedLastName?: string;\n firstName?: string;\n lastName?: string;\n name?: string;\n headline?: string;\n vanityName?: string;\n profilePicture?: unknown;\n}\n\ninterface LinkedInPostData {\n id?: string;\n text?: string;\n commentary?: string;\n created?: { time?: number };\n timestamp?: string;\n author?: string;\n}\n\ninterface LinkedInFormatterProps {\n data: unknown;\n}\n\nfunction isProfile(data: unknown): data is LinkedInProfileData {\n if (typeof data !== \"object\" || data === null) return false;\n return \"localizedFirstName\" in data || \"firstName\" in data || (\"name\" in data && \"headline\" in data);\n}\n\nfunction isPost(data: unknown): data is LinkedInPostData {\n if (typeof data !== \"object\" || data === null) return false;\n return (\"text\" in data || \"commentary\" in data) && !(\"localizedFirstName\" in data);\n}\n\nfunction formatRelativeDate(dateStr: string | number): string {\n try {\n const date = typeof dateStr === \"number\" ? new Date(dateStr) : new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0) return \"today\";\n if (diffDays === 1) return \"yesterday\";\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return String(dateStr);\n }\n}\n\nfunction ProfileCard({ profile }: { profile: LinkedInProfileData }) {\n const name = profile.name ||\n [profile.localizedFirstName || profile.firstName, profile.localizedLastName || profile.lastName]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1\">\n <div className=\"flex items-start gap-2\">\n <User className=\"h-4 w-4 text-muted-foreground mt-0.5 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-foreground\">{name || \"LinkedIn Profile\"}</p>\n {profile.headline && (\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{profile.headline}</p>\n )}\n {profile.vanityName && (\n <p className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <ExternalLink className=\"h-3 w-3\" />\n linkedin.com/in/{profile.vanityName}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nfunction PostCard({ post }: { post: LinkedInPostData }) {\n const content = post.text || post.commentary;\n const time = post.created?.time || post.timestamp;\n\n return (\n <div className=\"rounded-lg border border-border bg-card p-3 space-y-1.5\">\n <div className=\"flex items-center gap-2\">\n <FileText className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n {post.author && (\n <span className=\"text-xs font-medium text-foreground\">{post.author}</span>\n )}\n {time && (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground ml-auto\">\n <Clock className=\"h-3 w-3\" />\n {formatRelativeDate(time)}\n </span>\n )}\n </div>\n {content && (\n <p className=\"text-sm text-foreground line-clamp-4\">{content}</p>\n )}\n </div>\n );\n}\n\nexport function LinkedInFormatter({ data }: LinkedInFormatterProps) {\n // Profile\n if (isProfile(data)) return <ProfileCard profile={data} />;\n\n // {posts: [...]}\n if (typeof data === \"object\" && data !== null && \"posts\" in data) {\n const posts = (data as any).posts;\n if (Array.isArray(posts)) {\n return (\n <div className=\"space-y-1.5\">\n {posts.filter(isPost).map((p, i) => <PostCard key={p.id || i} post={p} />)}\n </div>\n );\n }\n }\n\n // {elements: [...]}\n if (typeof data === \"object\" && data !== null && \"elements\" in data) {\n const elements = (data as any).elements;\n if (Array.isArray(elements)) {\n const posts = elements.filter(isPost);\n if (posts.length > 0) {\n return (\n <div className=\"space-y-1.5\">\n {posts.map((p, i) => <PostCard key={p.id || i} post={p} />)}\n </div>\n );\n }\n }\n }\n\n if (isPost(data)) return <PostCard post={data} />;\n\n if (Array.isArray(data)) {\n const posts = data.filter(isPost);\n if (posts.length > 0) {\n return <div className=\"space-y-1.5\">{posts.map((p, i) => <PostCard key={p.id || i} post={p} />)}</div>;\n }\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\n\ninterface GenericFormatterProps {\n data: unknown;\n}\n\nexport function GenericFormatter({ data }: GenericFormatterProps) {\n if (data === null || data === undefined) {\n return (\n <p className=\"text-sm text-muted-foreground italic\">No data returned</p>\n );\n }\n\n return (\n <pre className=\"rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto\">\n {JSON.stringify(data, null, 2)}\n </pre>\n );\n}\n","import React from \"react\";\nimport { getFormatterType, resolveToolName, type FormatterType } from \"./utils.js\";\nimport { CollapsibleResult } from \"./collapsible-result.js\";\nimport { getSummary, type SummaryResult } from \"./summaries.js\";\nimport { normalizeMicrosoftMail, normalizeMicrosoftCalendar, normalizeMicrosoftDrive } from \"./normalizers.js\";\nimport { EmailFormatter } from \"./formatters/email.js\";\nimport { CalendarEventFormatter } from \"./formatters/calendar-event.js\";\nimport { SlackMessageFormatter } from \"./formatters/slack-message.js\";\nimport { GithubFormatter } from \"./formatters/github.js\";\nimport { DriveFileFormatter } from \"./formatters/drive-file.js\";\nimport { SearchFormatter } from \"./formatters/search.js\";\nimport { DocsFormatter } from \"./formatters/docs.js\";\nimport { SheetsFormatter } from \"./formatters/sheets.js\";\nimport { SlidesFormatter } from \"./formatters/slides.js\";\nimport { HubspotFormatter } from \"./formatters/hubspot.js\";\nimport { LinearFormatter } from \"./formatters/linear.js\";\nimport { PipedriveFormatter } from \"./formatters/pipedrive.js\";\nimport { ComputeFormatter } from \"./formatters/compute.js\";\nimport { ResendFormatter } from \"./formatters/resend.js\";\nimport { InboxFormatter } from \"./formatters/inbox.js\";\nimport { DiscordFormatter } from \"./formatters/discord.js\";\nimport { NotionFormatter } from \"./formatters/notion.js\";\nimport { TwitterFormatter } from \"./formatters/twitter.js\";\nimport { TelegramFormatter } from \"./formatters/telegram.js\";\nimport { StripeFormatter } from \"./formatters/stripe.js\";\nimport { JiraFormatter } from \"./formatters/jira.js\";\nimport { SalesforceFormatter } from \"./formatters/salesforce.js\";\nimport { BrevoFormatter } from \"./formatters/brevo.js\";\nimport { CalendlyFormatter } from \"./formatters/calendly.js\";\nimport { TwilioFormatter } from \"./formatters/twilio.js\";\nimport { LinkedInFormatter } from \"./formatters/linkedin.js\";\nimport { GenericFormatter } from \"./formatters/generic.js\";\n\nexport interface ToolResultPart {\n type: string;\n // AI SDK v4+ (tool-{name} or dynamic-tool)\n toolName?: string;\n state?: string;\n output?: unknown;\n input?: unknown;\n // AI SDK v3 (tool-invocation)\n toolInvocation?: {\n toolName: string;\n state: string;\n result?: unknown;\n args?: Record<string, unknown>;\n };\n // Legacy v4 fields\n result?: unknown;\n args?: Record<string, unknown>;\n}\n\ninterface SupyagentToolResultProps {\n part: ToolResultPart;\n}\n\n/**\n * Extract the tool name from a part.\n */\nexport function extractToolName(part: ToolResultPart): string {\n if (part.type.startsWith(\"tool-\") && part.type !== \"tool-invocation\") {\n return part.type.slice(5);\n }\n if (part.type === \"dynamic-tool\" && part.toolName) {\n return part.toolName;\n }\n if (part.toolName) return part.toolName;\n if (part.toolInvocation?.toolName) return part.toolInvocation.toolName;\n return \"unknown\";\n}\n\nexport function extractState(part: ToolResultPart): string | undefined {\n return part.state ?? part.toolInvocation?.state;\n}\n\n/**\n * Unwrap supyagent's `{ok, data}` envelope so formatters see the inner payload.\n */\nexport function unwrapSupyagentResult(result: unknown): unknown {\n if (\n typeof result === \"object\" &&\n result !== null &&\n \"ok\" in result &&\n \"data\" in result\n ) {\n return (result as Record<string, unknown>).data;\n }\n return result;\n}\n\nexport function extractArgs(part: ToolResultPart): Record<string, unknown> | undefined {\n if (part.input && typeof part.input === \"object\" && !Array.isArray(part.input)) {\n return part.input as Record<string, unknown>;\n }\n if (part.args) return part.args;\n return part.toolInvocation?.args;\n}\n\nexport function extractResult(part: ToolResultPart): unknown {\n let raw: unknown;\n // v4+: output field\n if (\"output\" in part && part.output !== undefined) raw = part.output;\n // Legacy: result field\n else if (\"result\" in part && part.result !== undefined) raw = part.result;\n // v3: toolInvocation.result\n else raw = part.toolInvocation?.result;\n\n return unwrapSupyagentResult(raw);\n}\n\n/**\n * Apply Microsoft data normalization when the formatter type came from a Microsoft tool prefix.\n */\nexport function maybeNormalize(toolName: string, formatterType: FormatterType, data: unknown): unknown {\n const lower = toolName.toLowerCase();\n const isMicrosoft = lower.startsWith(\"microsoft_\") || lower.startsWith(\"outlook_\") || lower.startsWith(\"onedrive_\");\n if (!isMicrosoft) return data;\n\n switch (formatterType) {\n case \"email\":\n return normalizeMicrosoftMail(data);\n case \"calendar\":\n return normalizeMicrosoftCalendar(data);\n case \"drive\":\n return normalizeMicrosoftDrive(data);\n default:\n return data;\n }\n}\n\nexport function renderFormatter(formatterType: FormatterType, data: unknown): React.ReactNode {\n switch (formatterType) {\n case \"email\":\n return <EmailFormatter data={data} />;\n case \"calendar\":\n return <CalendarEventFormatter data={data} />;\n case \"slack\":\n return <SlackMessageFormatter data={data} />;\n case \"github\":\n return <GithubFormatter data={data} />;\n case \"drive\":\n return <DriveFileFormatter data={data} />;\n case \"search\":\n return <SearchFormatter data={data} />;\n case \"docs\":\n return <DocsFormatter data={data} />;\n case \"sheets\":\n return <SheetsFormatter data={data} />;\n case \"slides\":\n return <SlidesFormatter data={data} />;\n case \"hubspot\":\n return <HubspotFormatter data={data} />;\n case \"linear\":\n return <LinearFormatter data={data} />;\n case \"pipedrive\":\n return <PipedriveFormatter data={data} />;\n case \"compute\":\n return <ComputeFormatter data={data} />;\n case \"resend\":\n return <ResendFormatter data={data} />;\n case \"inbox\":\n return <InboxFormatter data={data} />;\n case \"discord\":\n return <DiscordFormatter data={data} />;\n case \"notion\":\n return <NotionFormatter data={data} />;\n case \"twitter\":\n return <TwitterFormatter data={data} />;\n case \"telegram\":\n return <TelegramFormatter data={data} />;\n case \"stripe\":\n return <StripeFormatter data={data} />;\n case \"jira\":\n return <JiraFormatter data={data} />;\n case \"salesforce\":\n return <SalesforceFormatter data={data} />;\n case \"brevo\":\n return <BrevoFormatter data={data} />;\n case \"calendly\":\n return <CalendlyFormatter data={data} />;\n case \"twilio\":\n return <TwilioFormatter data={data} />;\n case \"linkedin\":\n return <LinkedInFormatter data={data} />;\n default:\n return <GenericFormatter data={data} />;\n }\n}\n\nexport function SupyagentToolResult({ part }: SupyagentToolResultProps) {\n const state = extractState(part);\n const result = extractResult(part);\n const rawToolName = extractToolName(part);\n const args = extractArgs(part);\n const toolName = resolveToolName(rawToolName, args);\n\n // Only render when we have a result\n if (state !== \"output-available\" || result === undefined) {\n return null;\n }\n\n const formatterType = getFormatterType(toolName);\n const data = maybeNormalize(toolName, formatterType, result);\n const summary: SummaryResult = getSummary(formatterType, data, toolName);\n\n return (\n <CollapsibleResult\n toolName={toolName}\n summary={summary.text}\n badge={summary.badge}\n >\n {renderFormatter(formatterType, data)}\n </CollapsibleResult>\n );\n}\n","import React from \"react\";\n\ninterface ToolInputProps {\n args: Record<string, unknown> | undefined;\n}\n\nfunction formatValue(value: unknown): { text: string; muted?: boolean } {\n if (value === null || value === undefined) {\n return { text: \"null\", muted: true };\n }\n if (typeof value === \"boolean\") {\n return { text: String(value), muted: true };\n }\n if (typeof value === \"number\") {\n return { text: String(value) };\n }\n if (typeof value === \"string\") {\n return { text: value };\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return { text: \"[]\", muted: true };\n // Simple arrays (primitives only): comma-join\n const allPrimitive = value.every(\n (v) => typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\",\n );\n if (allPrimitive) {\n const joined = value.join(\", \");\n return { text: joined.length > 80 ? joined.slice(0, 77) + \"...\" : joined };\n }\n return { text: `${value.length} items`, muted: true };\n }\n if (typeof value === \"object\") {\n const json = JSON.stringify(value);\n if (json.length <= 60) return { text: json, muted: true };\n return { text: json.slice(0, 57) + \"...\", muted: true };\n }\n return { text: String(value) };\n}\n\nexport function ToolInput({ args }: ToolInputProps) {\n if (!args || Object.keys(args).length === 0) return null;\n\n return (\n <div className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm\">\n {Object.entries(args).map(([key, value]) => {\n const formatted = formatValue(value);\n return (\n <React.Fragment key={key}>\n <span className=\"text-muted-foreground select-none\">{key}</span>\n <span className={formatted.muted ? \"text-muted-foreground\" : \"text-foreground\"}>\n {formatted.text}\n </span>\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight, Check, AlertCircle, Loader2 } from \"lucide-react\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport { humanizeToolName, getProviderLabel, getProviderFromToolName, getFormatterType } from \"./utils.js\";\nimport { getSummary, type SummaryResult } from \"./summaries.js\";\nimport {\n type ToolResultPart,\n extractToolName,\n extractState,\n extractArgs,\n extractResult,\n maybeNormalize,\n renderFormatter,\n} from \"./tool-result.js\";\nimport { ToolInput } from \"./tool-input.js\";\n\ninterface SupyagentToolActionProps {\n part: ToolResultPart;\n defaultExpanded?: boolean;\n}\n\nconst BADGE_STYLES: Record<string, string> = {\n default: \"bg-muted text-muted-foreground\",\n success: \"bg-green-500/10 text-green-500\",\n error: \"bg-destructive/10 text-destructive\",\n warning: \"bg-yellow-500/10 text-yellow-600\",\n};\n\nexport function SupyagentToolAction({ part, defaultExpanded = false }: SupyagentToolActionProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n\n const toolName = extractToolName(part);\n const state = extractState(part);\n const args = extractArgs(part);\n\n const provider = getProviderFromToolName(toolName);\n const providerLabel = getProviderLabel(provider);\n const actionLabel = humanizeToolName(toolName);\n\n // Support both legacy state names and AI SDK v6 state names\n const isStreaming = state === \"input-streaming\" || state === \"partial-call\" || state === \"call\";\n const isError = state === \"output-error\" || state === \"error\";\n const isDone = state === \"output-available\" || state === \"result\";\n const hasResult = isDone || isError;\n\n // Compute summary and formatter output when result is available\n let summary: SummaryResult | undefined;\n let formatterOutput: React.ReactNode | undefined;\n\n if (hasResult) {\n const result = extractResult(part);\n if (result !== undefined) {\n const formatterType = getFormatterType(toolName);\n const data = maybeNormalize(toolName, formatterType, result);\n summary = getSummary(formatterType, data, toolName);\n formatterOutput = renderFormatter(formatterType, data);\n }\n }\n\n // Determine if there's content to expand\n const hasArgs = args && Object.keys(args).length > 0;\n const hasExpandableContent = hasArgs || formatterOutput;\n const canExpand = !isStreaming && hasExpandableContent;\n\n return (\n <div\n className=\"rounded-lg border border-border bg-card overflow-hidden\"\n data-state={isDone ? \"done\" : isError ? \"error\" : isStreaming ? \"streaming\" : \"pending\"}\n >\n {/* Header bar */}\n <button\n type=\"button\"\n onClick={() => canExpand && setExpanded(!expanded)}\n className={`flex items-center gap-2 w-full px-3 py-2 text-left transition-colors ${\n canExpand ? \"hover:bg-muted cursor-pointer\" : \"cursor-default\"\n }`}\n >\n <div className=\"relative shrink-0\">\n <ProviderIcon toolName={toolName} className=\"h-4 w-4 text-muted-foreground\" />\n {isStreaming && (\n <Loader2 className=\"absolute -top-1 -right-1 h-3 w-3 text-primary animate-spin\" />\n )}\n </div>\n\n <span className=\"text-xs text-muted-foreground\">{providerLabel}</span>\n <span className=\"text-sm text-foreground\">{actionLabel}</span>\n\n {/* Summary text (when result available) */}\n {summary && (\n <>\n <span className=\"text-muted-foreground text-xs\">·</span>\n <span className=\"text-sm text-muted-foreground flex-1 truncate\">{summary.text}</span>\n </>\n )}\n {!summary && <span className=\"flex-1\" />}\n\n {/* Badge */}\n {summary?.badge && (\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium shrink-0 ${\n BADGE_STYLES[summary.badge.variant || \"default\"]\n }`}\n >\n {summary.badge.text}\n </span>\n )}\n\n {/* Status indicator */}\n {isDone && (\n <Check className=\"h-3.5 w-3.5 text-green-500 shrink-0\" />\n )}\n {isError && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive shrink-0\">\n <AlertCircle className=\"h-3 w-3\" />\n Error\n </span>\n )}\n {isStreaming && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary animate-pulse shrink-0\">\n Calling...\n </span>\n )}\n\n {/* Chevron */}\n {canExpand && (\n expanded\n ? <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n : <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground shrink-0\" />\n )}\n </button>\n\n {/* Expandable body */}\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n style={{ gridTemplateRows: expanded ? \"1fr\" : \"0fr\" }}\n >\n <div className=\"overflow-hidden\">\n <div className=\"border-t border-border px-3 py-2 space-y-3\">\n {/* Input section */}\n {args && Object.keys(args).length > 0 && (\n <div>\n <p className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-1.5\">\n Input\n </p>\n <ToolInput args={args} />\n </div>\n )}\n\n {/* Output section */}\n {formatterOutput && (\n <div>\n <p className=\"text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-1.5\">\n Output\n </p>\n {formatterOutput}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight, Check, AlertCircle, Loader2 } from \"lucide-react\";\nimport { ProviderIcon } from \"./provider-icon.js\";\nimport { humanizeToolName, getProviderLabel, getProviderFromToolName } from \"./utils.js\";\n\ninterface ToolCallPart {\n type: string;\n // AI SDK v4+ (tool-{name} or dynamic-tool)\n toolName?: string;\n toolCallId?: string;\n state?: string;\n input?: Record<string, unknown>;\n output?: unknown;\n // AI SDK v3 (tool-invocation)\n toolInvocation?: {\n toolName: string;\n state: string;\n args?: Record<string, unknown>;\n result?: unknown;\n };\n // Legacy v4 fields\n args?: Record<string, unknown>;\n}\n\ninterface SupyagentToolCallProps {\n part: ToolCallPart;\n}\n\n/**\n * Extract the tool name from a part.\n * Handles: tool-{name} type, dynamic-tool with toolName, legacy tool-invocation, direct toolName.\n */\nfunction extractToolName(part: ToolCallPart): string {\n // AI SDK v4+: type is \"tool-{name}\"\n if (part.type.startsWith(\"tool-\") && part.type !== \"tool-invocation\") {\n return part.type.slice(5); // strip \"tool-\" prefix\n }\n // Dynamic tool\n if (part.type === \"dynamic-tool\" && part.toolName) {\n return part.toolName;\n }\n // Direct toolName field\n if (part.toolName) return part.toolName;\n // Legacy v3\n if (part.toolInvocation?.toolName) return part.toolInvocation.toolName;\n return \"unknown\";\n}\n\nfunction extractState(part: ToolCallPart): string {\n return part.state || part.toolInvocation?.state || \"input-available\";\n}\n\nfunction extractArgs(part: ToolCallPart): Record<string, unknown> | undefined {\n return part.input || part.args || part.toolInvocation?.args;\n}\n\nexport function SupyagentToolCall({ part }: SupyagentToolCallProps) {\n const [expanded, setExpanded] = useState(false);\n\n const toolName = extractToolName(part);\n const state = extractState(part);\n const args = extractArgs(part);\n\n const provider = getProviderFromToolName(toolName);\n const providerLabel = getProviderLabel(provider);\n const actionLabel = humanizeToolName(toolName);\n\n const isStreaming = state === \"input-streaming\";\n const isError = state === \"output-error\";\n const isDone = state === \"output-available\";\n\n return (\n <div\n className=\"rounded-lg border border-border bg-card overflow-hidden\"\n data-state={isDone ? \"done\" : isError ? \"error\" : isStreaming ? \"streaming\" : \"pending\"}\n >\n <button\n type=\"button\"\n onClick={() => args && setExpanded(!expanded)}\n className=\"flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-muted transition-colors\"\n >\n <div className=\"relative\">\n <ProviderIcon toolName={toolName} className=\"h-4 w-4 text-muted-foreground\" />\n {isStreaming && (\n <Loader2 className=\"absolute -top-1 -right-1 h-3 w-3 text-primary animate-spin\" />\n )}\n </div>\n\n <span className=\"text-xs text-muted-foreground\">{providerLabel}</span>\n <span className=\"text-sm text-foreground flex-1\">{actionLabel}</span>\n\n {isDone && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-green-500/10 px-2 py-0.5 text-xs text-green-500\">\n <Check className=\"h-3 w-3\" />\n Completed\n </span>\n )}\n {isError && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive\">\n <AlertCircle className=\"h-3 w-3\" />\n Error\n </span>\n )}\n {isStreaming && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary animate-pulse\">\n Calling...\n </span>\n )}\n\n {args && (\n expanded\n ? <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" />\n : <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n </button>\n\n {expanded && args && (\n <div className=\"border-t border-border px-3 py-2\">\n <pre className=\"text-xs text-muted-foreground overflow-x-auto\">\n {JSON.stringify(args, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["import_lucide_react","import_jsx_runtime","n","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","formatRelativeDate","import_lucide_react","import_jsx_runtime","UsersIcon","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","formatCurrency","DealCard","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","formatRecipients","import_lucide_react","import_jsx_runtime","formatTimestamp","EventCard","import_lucide_react","import_jsx_runtime","formatRelativeDate","ChannelCard","import_lucide_react","import_jsx_runtime","formatRelativeDate","import_lucide_react","import_jsx_runtime","formatRelativeDate","import_lucide_react","import_jsx_runtime","MessageCard","import_lucide_react","import_jsx_runtime","formatUnixDate","import_lucide_react","import_jsx_runtime","IssueCard","ProjectCard","import_lucide_react","import_jsx_runtime","ContactCard","import_lucide_react","import_jsx_runtime","STATUS_STYLES","ContactCard","import_lucide_react","import_jsx_runtime","STATUS_STYLES","EventCard","import_lucide_react","import_jsx_runtime","formatRelativeDate","STATUS_STYLES","MessageCard","import_lucide_react","import_jsx_runtime","formatRelativeDate","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_lucide_react","import_jsx_runtime","BADGE_STYLES","import_react","import_lucide_react","import_jsx_runtime","extractToolName","extractState","extractArgs"]}
|