@flexkit/automations 0.0.24 → 0.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +281 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +9 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sidebar.tsx","../src/root.tsx","../src/api.ts","../src/form.tsx","../src/pages.tsx","../src/index.tsx"],"names":["NavLinkCompat","NavLink","AutomationsSidebar","isRunHistory","useLocation","jsxs","SidebarPanel","jsx","SidebarContent","SidebarGroup","SidebarMenu","SidebarMenuItem","SidebarMenuButton","BotIcon","HistoryIcon","SidebarRail","SIDEBAR_COOKIE_NAME","Root","currentProjectId","useConfig","defaultOpen","row","SidebarProvider","SidebarInset","Outlet","getDashboardOrigin","hostname","protocol","getApiRootDomain","getWebhookTriggerUrl","projectId","token","createApiClient","projectBasePath","automationsBasePath","request","url","init","response","data","error","runId","input","automationId","artifactId","options","suffix","teamId","workflowRunId","provider","fetcher","paths","basePath","offset","limit","scope","TOOL_PROVIDERS","TRIGGER_EVENTS","HOURLY_CRON","DEFAULT_DAILY_CRON","DEFAULT_WEEKLY_CRON","DEFAULT_CUSTOM_CRON","DAY_OPTIONS","HOUR_OPTIONS","_","hour","isFormValidationClean","validation","FieldError","id","message","TriangleAlertIcon","createTriggerKey","getInitialTriggers","automation","trigger","getLocalTimezone","generateWebhookSecret","bytes","byte","parseScheduleKind","cron","daily","weekly","getNextRuns","timezone","count","expression","CronExpressionParser","formatRunDate","date","getCronError","trimmed","fieldCount","getModelOptions","models","mode","selectedModelId","activeModels","model","selectedModel","getChannelKey","channel","mergeChannels","selectedChannels","availableChannels","channelsByKey","getInitialProviderToolFormData","providerTools","getInitialToolsFormData","tools","ChannelPicker","channels","disabled","loading","onChange","onRefresh","value","open","setOpen","useState","query","setQuery","containerRef","useRef","selectedIds","providerLabel","filteredChannels","useEffect","handlePointerDown","event","target","handleKeyDown","handleSelect","selectedChannel","handleRemove","channelId","Button","current","Badge","XIcon","ChevronsUpDownIcon","Input","CheckIcon","Fragment","LoaderCircleIcon","RefreshCwIcon","NextRunLabel","nextRun","HourSelect","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","DaySelect","day","CronEditor","nextRuns","ChevronDownIcon","run","ScheduleTriggerRow","kind","WebhookTriggerRow","copiedUrl","setCopiedUrl","copiedSecret","setCopiedSecret","copyToClipboard","text","markCopied","Tooltip","TooltipTrigger","CopyIcon","TooltipContent","KeyRoundIcon","EntityTriggerRow","entities","toggleEvent","events","toggleEntity","entity","selected","entityLabel","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","TriggersField","errors","triggers","hasWebhookTrigger","addTrigger","addScheduleTrigger","updateTrigger","updated","removeTrigger","key","ClockIcon","WebhookIcon","DatabaseZapIcon","Trash2Icon","Separator","PlusIcon","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","SlackIcon","TeamsIcon","AutomationForm","api","onSaved","name","setName","instructions","setInstructions","enabled","setEnabled","modelId","setModelId","setTriggers","isSaving","setIsSaving","setMessage","touched","setTouched","toolsFormData","setToolsFormData","toolsUrl","toolsData","useSWR","entitiesData","modelOptions","useMemo","effectiveModelId","triggerErrors","cronError","toolErrors","tool","isValid","showNameError","showInstructionsError","loadProviderChannels","useCallback","result","loadErrorMessage","updateTool","handleRemoveTool","handleSubmit","toolConfigs","_key","toast","Label","Switch","Textarea","BrainIcon","useProjectApi","PageMessage","children","StatusBadge","status","getScheduleSummary","getTriggerSummary","summaries","isAutomationRunnable","CreditButton","creditBalance","CoinsIcon","AutomationsPage","navigate","useNavigate","mutate","automations","a","b","aTime","handleDelete","SidebarTrigger","ExternalLink","Link","Plus","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","formatDistance","Ellipsis","Pencil","DropdownMenuSeparator","Trash2","CreateAutomationPage","ArrowLeft","ScrollArea","AutomationDetailPage","useParams","isRunning","startTransition","useTransition","automationApi","canRunAutomation","selectedAutomationId","handleRunNow","Tabs","TabsList","TabsTrigger","LoaderCircle","Play","RUNS_PAGE_SIZE","RunsPage","getRunsKey","pageIndex","previousPage","runPages","setSize","size","useSWRInfinite","runs","page","hasMore","isLoadingMore","handleLoadMore","currentSize","RunsTable","InfiniteScrollSentinel","onVisible","sentinelRef","onVisibleRef","node","observer","entries","entry","RunHistoryPage","setScope","getHistoryKey","historyPages","metrics","MetricCard","title","MAX_STREAM_ATTEMPTS","STREAM_RETRY_DELAY_MS","JSON_RENDER_SPEC_PART_TYPE","delay","ms","resolve","isAbortError","hasRenderableParts","parts","part","getMarkerIds","messages","markerIds","splitSessionMessages","chunkIndex","flush","getPartData","useSessionMessages","useRunStream","streamApi","setStatus","abortController","consumeOnce","sawFinish","chunkStream","parseJsonEventStream","uiMessageChunkSchema","controller","messageStream","readUIMessageStream","consume","attempt","loadTimeout","RunDetailPage","automationData","isCancelling","startCancelTransition","runApi","selectedRunId","handleCancel","format","RunReplay","rawMessages","replayMessage","ReplayMessage","isUser","ZapIcon","index","MessagePart","partIndex","TextPart","ReasoningPart","GenerateFilesPart","RunArtifactPart","ToolDeliveryPart","RunSummaryPart","StatusToolPart","TerminalIcon","SearchIcon","getValidateGraphqlMessage","operationLabel","BulkGraphqlActionPart","CheckCircle2Icon","nextPart","ToolMessage","ToolHeader","UnknownDataPart","className","StatusIcon","isError","icon","lastInProgress","generated","generating","CloudUploadIcon","path","isDone","previewUrl","downloadUrl","formatBytes","FileTextIcon","getArtifactLabel","DownloadIcon","MessageSquareIcon","SendIcon","CircleSlashIcon","XCircleIcon","progress","sizeBytes","kilobytes","Automations"],"mappings":"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","file":"index.js","sourcesContent":["import type { JSX } from 'react';\nimport { BotIcon, HistoryIcon } from 'lucide-react';\nimport { NavLink, useLocation } from 'react-router-dom';\nimport {\n SidebarContent,\n SidebarGroup,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarPanel,\n SidebarRail,\n} from '@flexkit/studio/ui';\n\nconst NavLinkCompat = NavLink as unknown as React.ComponentType<{\n children?: React.ReactNode;\n to: string;\n}>;\n\nexport function AutomationsSidebar(): JSX.Element {\n const location = useLocation();\n const isRunHistory = location.pathname.endsWith('/automations/runs');\n\n return (\n <SidebarPanel collapsible=\"icon\" variant=\"inset\">\n <SidebarContent>\n <SidebarGroup>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton asChild isActive={!isRunHistory} tooltip=\"Automations\">\n <NavLinkCompat to=\".\">\n <BotIcon className=\"fk:h-4 fk:w-4\" strokeWidth={2} />\n <span>Automations</span>\n </NavLinkCompat>\n </SidebarMenuButton>\n </SidebarMenuItem>\n <SidebarMenuItem>\n <SidebarMenuButton asChild isActive={isRunHistory} tooltip=\"Run History\">\n <NavLinkCompat to=\"runs\">\n <HistoryIcon className=\"fk:h-4 fk:w-4\" strokeWidth={2} />\n <span>Run History</span>\n </NavLinkCompat>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarGroup>\n </SidebarContent>\n <SidebarRail />\n </SidebarPanel>\n );\n}\n","import type { JSX } from 'react';\nimport { Outlet, useConfig } from '@flexkit/studio';\nimport {\n Separator,\n SidebarInset,\n SidebarProvider,\n SidebarTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@flexkit/studio/ui';\nimport { AutomationsSidebar } from './sidebar';\n\nconst SIDEBAR_COOKIE_NAME = 'flexkit:sidebar:state';\n\nexport function Root(): JSX.Element {\n const { currentProjectId } = useConfig();\n const defaultOpen =\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${SIDEBAR_COOKIE_NAME}=`))\n ?.split('=')[1] !== 'false';\n\n if (!currentProjectId) {\n return (\n <main className=\"fk:flex fk:h-full fk:flex-1 fk:items-center fk:justify-center fk:p-8 fk:text-sm fk:text-muted-foreground\">\n Select a project to manage automations.\n </main>\n );\n }\n\n return (\n <SidebarProvider className=\"fk:h-full\" defaultOpen={defaultOpen}>\n <AutomationsSidebar />\n <SidebarInset>\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:overflow-hidden fk:px-4 fk:pt-3\">\n {/* <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div>\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Automations</h1>\n <p className=\"fk:mt-1 fk:text-sm fk:text-muted-foreground\">\n Agent-powered tasks that run on a schedule or when your data changes.\n </p>\n </div>\n </div> */}\n <div className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">\n <Outlet />\n </div>\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n}\n","import type {\n Automation,\n AutomationArtifact,\n AutomationInput,\n AutomationToolChannel,\n AutomationToolProvider,\n MutationResult,\n} from './types';\n\nexport interface ApiClient {\n cancelRun: (_runId: string) => Promise<MutationResult>;\n createAutomation: (_input: AutomationInput) => Promise<MutationResult & { automation?: Automation }>;\n deleteAutomation: (_automationId: string) => Promise<MutationResult>;\n getArtifactUrl: (_artifactId: string, _options?: { download?: boolean }) => string;\n getIntegrationManageUrl: (_teamId: string) => string;\n getRunArtifacts: (_workflowRunId: string) => Promise<AutomationArtifact[]>;\n getStreamUrl: (_workflowRunId: string) => string;\n listChannels: (_provider: AutomationToolProvider) => Promise<{\n channels: AutomationToolChannel[];\n errorMessage?: string;\n success: boolean;\n }>;\n runAutomation: (_automationId: string) => Promise<MutationResult & { runId?: string }>;\n updateAutomation: (\n _automationId: string,\n _input: AutomationInput\n ) => Promise<MutationResult & { automation?: Automation }>;\n}\n\nfunction getDashboardOrigin(): string {\n if (typeof window === 'undefined') {\n return 'https://flexkit.io';\n }\n\n const { hostname, protocol } = window.location;\n\n if (hostname === 'localhost' || hostname === '127.0.0.1') {\n return 'https://flexkit.test';\n }\n\n if (hostname === 'flexkit.test' || hostname.endsWith('.flexkit.test')) {\n return `${protocol}//flexkit.test`;\n }\n\n return 'https://flexkit.io';\n}\n\nfunction getApiRootDomain(): string {\n if (typeof window === 'undefined') {\n return 'flexkit.io';\n }\n\n const { hostname } = window.location;\n const isDevHost =\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname === 'flexkit.test' ||\n hostname.endsWith('.flexkit.test');\n\n return isDevHost ? 'flexkit.test' : 'flexkit.io';\n}\n\n/** Public URL an external system calls to fire a webhook trigger. */\nexport function getWebhookTriggerUrl(projectId: string, token: string): string {\n return `https://${projectId}.api.${getApiRootDomain()}/automations/webhook/${encodeURIComponent(token)}`;\n}\n\nexport function createApiClient(projectId: string): ApiClient {\n const projectBasePath = `/api/flexkit/${projectId}`;\n const automationsBasePath = `${projectBasePath}/automations`;\n\n async function request<T>(url: string, init?: RequestInit): Promise<T> {\n const response = await fetch(url, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n ...init,\n });\n const data = (await response.json()) as T;\n\n if (!response.ok) {\n const error = data && typeof data === 'object' && 'error' in data ? String(data.error) : 'Request failed';\n\n throw new Error(error);\n }\n\n return data;\n }\n\n return {\n cancelRun: async (runId) =>\n request<MutationResult>(`${automationsBasePath}/runs/${encodeURIComponent(runId)}/cancel`, { method: 'POST' }),\n createAutomation: async (input) =>\n request<MutationResult & { automation?: Automation }>(automationsBasePath, {\n body: JSON.stringify(input),\n method: 'POST',\n }),\n deleteAutomation: async (automationId) =>\n request<MutationResult>(`${automationsBasePath}/${encodeURIComponent(automationId)}`, { method: 'DELETE' }),\n getArtifactUrl: (artifactId, options) => {\n const suffix = options?.download ? '?download=1' : '';\n\n return `${automationsBasePath}/artifacts/${encodeURIComponent(artifactId)}/content${suffix}`;\n },\n getIntegrationManageUrl: (teamId) => `${getDashboardOrigin()}/dashboard/${teamId}/${projectId}/integrations`,\n getRunArtifacts: async (workflowRunId) =>\n request<{ artifacts: AutomationArtifact[] }>(\n `${automationsBasePath}/runs/${encodeURIComponent(workflowRunId)}/artifacts`\n ).then((response) => response.artifacts),\n getStreamUrl: (workflowRunId) => `${automationsBasePath}/runs/${encodeURIComponent(workflowRunId)}/stream`,\n listChannels: async (provider) => {\n const response = await fetch(`${projectBasePath}/integrations/${provider}/channels`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n const data = (await response.json()) as {\n channels?: AutomationToolChannel[];\n error?: string;\n errorMessage?: string;\n success?: boolean;\n };\n\n if (response.ok) {\n return {\n channels: data.channels ?? [],\n errorMessage: data.errorMessage,\n success: data.success ?? true,\n };\n }\n\n if (data.success === false) {\n return {\n channels: data.channels ?? [],\n errorMessage: data.errorMessage ?? `Failed to load ${provider === 'slack' ? 'Slack' : 'Teams'} channels.`,\n success: false,\n };\n }\n\n const error = data.error ? String(data.error) : 'Request failed';\n\n throw new Error(error);\n },\n runAutomation: async (automationId) =>\n request<MutationResult & { runId?: string }>(`${automationsBasePath}/${encodeURIComponent(automationId)}/runs`, {\n method: 'POST',\n }),\n updateAutomation: async (automationId, input) =>\n request<MutationResult & { automation?: Automation }>(\n `${automationsBasePath}/${encodeURIComponent(automationId)}`,\n {\n body: JSON.stringify(input),\n method: 'PATCH',\n }\n ),\n };\n}\n\nexport const fetcher = async <T>(url: string): Promise<T> => {\n const response = await fetch(url, { credentials: 'include' });\n\n if (!response.ok) {\n throw new Error('Request failed');\n }\n\n return (await response.json()) as T;\n};\n\nexport function paths(projectId: string): {\n automation: (_automationId: string) => string;\n automationRuns: (_automationId: string, _offset?: number, _limit?: number) => string;\n automations: string;\n creditBalance: string;\n entities: string;\n run: (_runId: string) => string;\n runHistory: (_scope: 'mine' | 'team', _offset?: number, _limit?: number) => string;\n tools: (_automationId?: string) => string;\n} {\n const basePath = `/api/flexkit/${projectId}/automations`;\n\n return {\n automation: (automationId) => `${basePath}/${encodeURIComponent(automationId)}`,\n automationRuns: (automationId, offset = 0, limit = 25) =>\n `${basePath}/${encodeURIComponent(automationId)}/runs?offset=${offset.toString()}&limit=${limit.toString()}`,\n automations: basePath,\n creditBalance: `${basePath}/credits`,\n entities: `${basePath}/entities`,\n run: (runId) => `${basePath}/runs/${encodeURIComponent(runId)}`,\n runHistory: (scope, offset = 0, limit = 25) =>\n `${basePath}/runs?scope=${scope}&offset=${offset.toString()}&limit=${limit.toString()}`,\n tools: (automationId) =>\n automationId ? `${basePath}/${encodeURIComponent(automationId)}/tools` : `${basePath}/tools`,\n };\n}\n","import type { FormEvent, JSX } from 'react';\nimport { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport useSWR from 'swr';\nimport { CronExpressionParser } from 'cron-parser';\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Separator,\n Switch,\n Textarea,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@flexkit/studio/ui';\nimport {\n BrainIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronsUpDownIcon,\n ClockIcon,\n CopyIcon,\n DatabaseZapIcon,\n KeyRoundIcon,\n LoaderCircleIcon,\n PlusIcon,\n RefreshCwIcon,\n Trash2Icon,\n TriangleAlertIcon,\n WebhookIcon,\n XIcon,\n} from 'lucide-react';\nimport { fetcher, getWebhookTriggerUrl, paths, type ApiClient } from './api';\nimport type {\n Automation,\n AutomationEntityTrigger,\n AutomationInput,\n AutomationScheduleTrigger,\n AutomationTools,\n AutomationToolChannel,\n AutomationToolConfigInput,\n AutomationToolProvider,\n AutomationTrigger,\n AutomationTriggerEvent,\n AutomationProviderTools,\n AutomationWebhookTrigger,\n} from './types';\n\ninterface AutomationFormProps {\n api: ApiClient;\n automation?: Automation;\n mode: 'create' | 'edit';\n onSaved: (_automation?: Automation) => void;\n projectId: string;\n}\n\ninterface ToolsResponse {\n tools: AutomationTools;\n}\n\ninterface AutomationProviderToolFormData extends AutomationProviderTools {\n availableChannels: AutomationToolChannel[];\n channelsLoadError?: string;\n channelsLoaded: boolean;\n loadingChannels: boolean;\n}\n\ntype AutomationToolsFormData = {\n slack: AutomationProviderToolFormData;\n teams: AutomationProviderToolFormData;\n};\n\ninterface ChannelPickerProps {\n channels: AutomationToolChannel[];\n disabled?: boolean;\n loading: boolean;\n onChange: (_channels: AutomationToolChannel[]) => void;\n onRefresh: () => void;\n provider: AutomationToolProvider;\n value: AutomationToolChannel[];\n}\n\nconst TOOL_PROVIDERS: AutomationToolProvider[] = ['slack', 'teams'];\n\nconst TRIGGER_EVENTS: AutomationTriggerEvent[] = ['create', 'update', 'delete'];\n\nconst HOURLY_CRON = '0 * * * *';\nconst DEFAULT_DAILY_CRON = '0 9 * * *';\nconst DEFAULT_WEEKLY_CRON = '0 9 * * 1';\nconst DEFAULT_CUSTOM_CRON = '0 9 1 * *';\n\nconst DAY_OPTIONS = [\n { label: 'Monday', value: 1 },\n { label: 'Tuesday', value: 2 },\n { label: 'Wednesday', value: 3 },\n { label: 'Thursday', value: 4 },\n { label: 'Friday', value: 5 },\n { label: 'Saturday', value: 6 },\n { label: 'Sunday', value: 0 },\n];\n\nconst HOUR_OPTIONS = Array.from({ length: 24 }, (_, hour) => ({\n label: `${hour.toString().padStart(2, '0')}:00`,\n value: hour,\n}));\n\ntype FormTrigger = AutomationTrigger & { key: string };\ntype ScheduleFormTrigger = AutomationScheduleTrigger & { key: string };\ntype WebhookFormTrigger = AutomationWebhookTrigger & { key: string };\ntype EntityFormTrigger = AutomationEntityTrigger & { key: string };\n\ntype ScheduleKind =\n | { kind: 'hourly' }\n | { hour: number; kind: 'daily' }\n | { day: number; hour: number; kind: 'weekly' }\n | { kind: 'custom' };\n\ninterface FormValidation {\n instructions: string;\n model: string;\n name: string;\n toolErrors: { [provider: string]: string };\n triggerErrors: { [triggerKey: string]: string };\n}\n\nfunction isFormValidationClean(validation: FormValidation): boolean {\n return (\n !validation.instructions &&\n !validation.model &&\n !validation.name &&\n Object.keys(validation.toolErrors).length === 0 &&\n Object.keys(validation.triggerErrors).length === 0\n );\n}\n\nfunction FieldError({ id, message }: { id?: string; message: string }): JSX.Element | null {\n if (!message) {\n return null;\n }\n\n return (\n <p className=\"fk:flex fk:items-start fk:text-sm fk:text-warning fk:gap-1\" id={id} role=\"alert\">\n <TriangleAlertIcon className=\"fk:size-4 fk:shrink-0 fk:mt-0.5\" />\n {message}\n </p>\n );\n}\n\nfunction createTriggerKey(): string {\n return crypto.randomUUID();\n}\n\nfunction getInitialTriggers(automation?: Automation): FormTrigger[] {\n return (automation?.triggers ?? []).map((trigger) => ({ ...trigger, key: trigger.id ?? createTriggerKey() }));\n}\n\nfunction getLocalTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n}\n\nfunction generateWebhookSecret(): string {\n const bytes = crypto.getRandomValues(new Uint8Array(24));\n\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\nfunction parseScheduleKind(cron: string): ScheduleKind {\n if (cron === HOURLY_CRON) {\n return { kind: 'hourly' };\n }\n\n const daily = /^0 (\\d{1,2}) \\* \\* \\*$/.exec(cron);\n\n if (daily) {\n return { hour: Number(daily[1]), kind: 'daily' };\n }\n\n const weekly = /^0 (\\d{1,2}) \\* \\* ([0-6])$/.exec(cron);\n\n if (weekly) {\n return { day: Number(weekly[2]), hour: Number(weekly[1]), kind: 'weekly' };\n }\n\n return { kind: 'custom' };\n}\n\nfunction getNextRuns(cron: string, timezone: string, count: number): Date[] {\n try {\n const expression = CronExpressionParser.parse(cron, { tz: timezone });\n\n return Array.from({ length: count }, () => expression.next().toDate());\n } catch {\n return [];\n }\n}\n\nfunction formatRunDate(date: Date, timezone: string): string {\n return new Intl.DateTimeFormat('en-US', {\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n month: 'short',\n timeZone: timezone,\n weekday: 'short',\n }).format(date);\n}\n\nfunction getCronError(cron: string, timezone: string): string | null {\n const trimmed = cron.trim();\n\n if (!trimmed) {\n return 'Cron expression is required';\n }\n\n const fieldCount = trimmed.split(/\\s+/).length;\n\n if (fieldCount < 5 || fieldCount > 6) {\n return `Expected 5 fields (min hour day month weekday), got ${fieldCount.toString()}`;\n }\n\n try {\n CronExpressionParser.parse(trimmed, { tz: timezone });\n\n return null;\n } catch {\n return 'Invalid cron expression';\n }\n}\n\nfunction getModelOptions(\n models: AutomationTools['models'],\n mode: AutomationFormProps['mode'],\n selectedModelId: string\n): AutomationTools['models'] {\n const activeModels = models.filter((model) => !model.deprecated);\n\n if (mode !== 'edit' || !selectedModelId) {\n return activeModels;\n }\n\n const selectedModel = models.find((model) => model.id === selectedModelId);\n\n if (selectedModel?.deprecated) {\n return [selectedModel, ...activeModels.filter((model) => model.id !== selectedModelId)];\n }\n\n if (!selectedModel && !activeModels.some((model) => model.id === selectedModelId)) {\n return [\n {\n deprecated: true,\n effort: null,\n id: selectedModelId,\n name: selectedModelId,\n },\n ...activeModels,\n ];\n }\n\n return activeModels;\n}\n\nfunction getChannelKey(channel: AutomationToolChannel): string {\n return `${channel.teamId ?? ''}:${channel.id}`;\n}\n\nfunction mergeChannels(\n selectedChannels: AutomationToolChannel[],\n availableChannels: AutomationToolChannel[]\n): AutomationToolChannel[] {\n const channelsByKey: { [key: string]: AutomationToolChannel } = {};\n\n for (const channel of [...selectedChannels, ...availableChannels]) {\n channelsByKey[getChannelKey(channel)] = channel;\n }\n\n return Object.values(channelsByKey);\n}\n\nfunction getInitialProviderToolFormData(\n providerTools: AutomationProviderTools,\n mode: AutomationFormProps['mode']\n): AutomationProviderToolFormData {\n return {\n ...providerTools,\n availableChannels: providerTools.channels,\n channelsLoaded: !providerTools.connected,\n enabled: providerTools.connected && mode === 'edit' && providerTools.enabled,\n loadingChannels: false,\n };\n}\n\nfunction getInitialToolsFormData(tools: AutomationTools, mode: AutomationFormProps['mode']): AutomationToolsFormData {\n return {\n slack: getInitialProviderToolFormData(tools.providers.slack, mode),\n teams: getInitialProviderToolFormData(tools.providers.teams, mode),\n };\n}\n\nfunction ChannelPicker({\n channels,\n disabled,\n loading,\n onChange,\n onRefresh,\n provider,\n value,\n}: ChannelPickerProps): JSX.Element {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const containerRef = useRef<HTMLDivElement | null>(null);\n const selectedIds = new Set(value.map((channel) => channel.id));\n const providerLabel = provider === 'slack' ? 'Slack' : 'Teams';\n const filteredChannels = channels.filter((channel) => channel.name.toLowerCase().includes(query.toLowerCase()));\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function handlePointerDown(event: PointerEvent): void {\n const { target } = event;\n\n if (!(target instanceof Node) || containerRef.current?.contains(target)) {\n return;\n }\n\n setOpen(false);\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') {\n return;\n }\n\n setOpen(false);\n }\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n function handleSelect(channel: AutomationToolChannel): void {\n if (selectedIds.has(channel.id)) {\n onChange(value.filter((selectedChannel) => selectedChannel.id !== channel.id));\n\n return;\n }\n\n onChange([...value, channel]);\n }\n\n function handleRemove(channelId: string): void {\n onChange(value.filter((channel) => channel.id !== channelId));\n }\n\n return (\n <div className=\"fk:relative\" ref={containerRef}>\n <Button\n aria-expanded={open}\n className=\"fk:h-auto fk:min-h-8 fk:w-full fk:max-w-100 fk:justify-between fk:bg-muted/60 fk:px-3 fk:py-1 hover:fk:border-secondary fk:dark:bg-muted/30\"\n disabled={disabled}\n role=\"combobox\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => setOpen((current) => !current)}\n >\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:gap-1\">\n {value.length === 0 ? (\n <span className=\"fk:text-muted-foreground\">\n {loading ? `Loading ${providerLabel} channels...` : `Select ${providerLabel} channels`}\n </span>\n ) : (\n value.map((channel) => (\n <Badge\n className=\"fk:rounded-sm fk:bg-accent fk:text-xs\"\n key={getChannelKey(channel)}\n variant=\"secondary\"\n onClick={(event) => {\n event.stopPropagation();\n handleRemove(channel.id);\n }}\n >\n {channel.name}\n <XIcon className=\"fk:ml-1 fk:size-3 fk:cursor-pointer\" />\n </Badge>\n ))\n )}\n </div>\n <ChevronsUpDownIcon className=\"fk:size-4 fk:shrink-0 fk:opacity-50\" />\n </Button>\n {open ? (\n <div className=\"fk:absolute fk:z-50 fk:mt-1 fk:w-full fk:max-w-100 fk:rounded-md fk:border fk:bg-popover fk:p-0 fk:text-popover-foreground fk:shadow-md\">\n <div className=\"fk:border-b fk:p-2\">\n <Input\n className=\"fk:h-8\"\n placeholder={`Search ${providerLabel} channels...`}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </div>\n <div className=\"fk:max-h-56 fk:overflow-auto fk:p-1\">\n {filteredChannels.length > 0 ? (\n filteredChannels.map((channel) => (\n <button\n className=\"fk:flex fk:w-full fk:items-center fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-left fk:text-sm hover:fk:bg-accent\"\n key={getChannelKey(channel)}\n type=\"button\"\n onClick={() => handleSelect(channel)}\n >\n <CheckIcon\n className={`fk:mr-2 fk:size-4 ${selectedIds.has(channel.id) ? 'fk:opacity-100' : 'fk:opacity-0'}`}\n />\n {channel.name}\n </button>\n ))\n ) : (\n <div className=\"fk:px-2 fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground\">\n {loading ? 'Loading channels...' : 'No channels found.'}\n </div>\n )}\n </div>\n <div className=\"fk:border-t fk:border-border fk:p-2\">\n <Button\n className=\"fk:h-8 fk:w-full fk:justify-start fk:text-xs\"\n disabled={loading}\n type=\"button\"\n variant=\"ghost\"\n onClick={onRefresh}\n >\n {loading ? (\n <>\n <LoaderCircleIcon className=\"fk:mr-2 fk:size-3 fk:animate-spin\" />\n Refreshing channels...\n </>\n ) : (\n <>\n <RefreshCwIcon className=\"fk:mr-2 fk:size-3\" />\n Refresh channels\n </>\n )}\n </Button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction NextRunLabel({ cron, timezone }: { cron: string; timezone: string }): JSX.Element | null {\n const [nextRun] = getNextRuns(cron, timezone, 1);\n\n if (!nextRun) {\n return null;\n }\n\n return <span className=\"fk:text-sm fk:text-muted-foreground\">Next run {formatRunDate(nextRun, timezone)}</span>;\n}\n\nfunction HourSelect({ onChange, value }: { onChange: (_hour: number) => void; value: number }): JSX.Element {\n return (\n <Select value={value.toString()} onValueChange={(hour) => onChange(Number(hour))}>\n <SelectTrigger\n aria-label=\"Hour\"\n className=\"fk:h-7 fk:w-fit fk:gap-1 fk:border-transparent fk:bg-background/90 fk:px-2 fk:py-0 fk:text-sm fk:shadow-sm hover:fk:border-border\"\n size=\"sm\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {HOUR_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value.toString()}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nfunction DaySelect({ onChange, value }: { onChange: (_day: number) => void; value: number }): JSX.Element {\n return (\n <Select value={value.toString()} onValueChange={(day) => onChange(Number(day))}>\n <SelectTrigger\n aria-label=\"Day of week\"\n className=\"fk:h-7 fk:w-fit fk:gap-1 fk:border-transparent fk:bg-background/90 fk:px-2 fk:py-0 fk:text-sm fk:shadow-sm hover:fk:border-border\"\n size=\"sm\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DAY_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value.toString()}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nfunction CronEditor({\n onChange,\n timezone,\n value,\n}: {\n onChange: (_cron: string) => void;\n timezone: string;\n value: string;\n}): JSX.Element {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const error = getCronError(value, timezone);\n const nextRuns = error ? [] : getNextRuns(value, timezone, 3);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function handlePointerDown(event: PointerEvent): void {\n const { target } = event;\n\n if (!(target instanceof Node) || containerRef.current?.contains(target)) {\n return;\n }\n\n setOpen(false);\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') {\n return;\n }\n\n setOpen(false);\n }\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <div className=\"fk:relative\" ref={containerRef}>\n <button\n className=\"fk:flex fk:items-center fk:gap-1.5 fk:rounded-md fk:bg-background/90 fk:px-2 fk:py-1 fk:font-mono fk:text-sm fk:shadow-sm hover:fk:bg-accent\"\n type=\"button\"\n onClick={() => setOpen((current) => !current)}\n >\n {value || 'Set cron'}\n <ChevronDownIcon className=\"fk:size-3.5 fk:opacity-50\" />\n </button>\n {open ? (\n <div className=\"fk:absolute fk:z-50 fk:mt-1 fk:w-72 fk:rounded-md fk:border fk:bg-popover fk:p-3 fk:text-popover-foreground fk:shadow-md\">\n <div className=\"fk:mb-2 fk:text-xs fk:text-muted-foreground\">Cron expression ({timezone})</div>\n <Input\n className={`fk:h-8 fk:font-mono ${error ? 'fk:border-destructive focus-visible:fk:ring-destructive' : ''}`}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n />\n {error ? (\n <p className=\"fk:mt-2 fk:text-xs fk:text-destructive\">{error}</p>\n ) : (\n <div className=\"fk:mt-2 fk:space-y-0.5 fk:text-xs fk:text-muted-foreground\">\n <p className=\"fk:mb-1\">5 fields: min hour day month weekday</p>\n {nextRuns.map((run) => (\n <p key={run.toISOString()}>{formatRunDate(run, timezone)}</p>\n ))}\n </div>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ScheduleTriggerRow({\n onChange,\n trigger,\n}: {\n onChange: (_trigger: ScheduleFormTrigger) => void;\n trigger: ScheduleFormTrigger;\n}): JSX.Element {\n const kind = parseScheduleKind(trigger.cron);\n\n if (kind.kind === 'hourly') {\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Every hour</span>\n <NextRunLabel cron={trigger.cron} timezone={trigger.timezone} />\n </div>\n );\n }\n\n if (kind.kind === 'daily') {\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Every day at</span>\n <HourSelect\n value={kind.hour}\n onChange={(hour) => onChange({ ...trigger, cron: `0 ${hour.toString()} * * *` })}\n />\n <span className=\"fk:text-muted-foreground\">{trigger.timezone}</span>\n <NextRunLabel cron={trigger.cron} timezone={trigger.timezone} />\n </div>\n );\n }\n\n if (kind.kind === 'weekly') {\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Every week on</span>\n <DaySelect\n value={kind.day}\n onChange={(day) => onChange({ ...trigger, cron: `0 ${kind.hour.toString()} * * ${day.toString()}` })}\n />\n <span>at</span>\n <HourSelect\n value={kind.hour}\n onChange={(hour) => onChange({ ...trigger, cron: `0 ${hour.toString()} * * ${kind.day.toString()}` })}\n />\n <span className=\"fk:text-muted-foreground\">{trigger.timezone}</span>\n <NextRunLabel cron={trigger.cron} timezone={trigger.timezone} />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Custom schedule</span>\n <CronEditor\n timezone={trigger.timezone}\n value={trigger.cron}\n onChange={(cron) => onChange({ ...trigger, cron })}\n />\n <span className=\"fk:text-muted-foreground\">{trigger.timezone}</span>\n <NextRunLabel cron={trigger.cron} timezone={trigger.timezone} />\n </div>\n );\n}\n\nfunction WebhookTriggerRow({\n onChange,\n projectId,\n trigger,\n}: {\n onChange: (_trigger: WebhookFormTrigger) => void;\n projectId: string;\n trigger: WebhookFormTrigger;\n}): JSX.Element {\n const [copiedUrl, setCopiedUrl] = useState(false);\n const [copiedSecret, setCopiedSecret] = useState(false);\n const url = trigger.url ?? getWebhookTriggerUrl(projectId, trigger.token);\n\n function copyToClipboard(text: string, markCopied: (_copied: boolean) => void): void {\n void navigator.clipboard.writeText(text).then(() => {\n markCopied(true);\n window.setTimeout(() => markCopied(false), 1500);\n });\n }\n\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Webhook triggered</span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className=\"fk:flex fk:min-w-0 fk:max-w-60 fk:items-center fk:gap-1.5 fk:rounded-md fk:bg-background/90 fk:px-2 fk:py-1 fk:text-xs fk:shadow-sm hover:fk:bg-accent\"\n type=\"button\"\n onClick={() => copyToClipboard(url, setCopiedUrl)}\n >\n <span className=\"fk:truncate\">{url}</span>\n {copiedUrl ? (\n <CheckIcon className=\"fk:size-3.5 fk:shrink-0\" />\n ) : (\n <CopyIcon className=\"fk:size-3.5 fk:shrink-0 fk:opacity-60\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"fk:max-w-96 fk:break-all\">{url}</TooltipContent>\n </Tooltip>\n {trigger.secret ? (\n <Button\n className=\"fk:h-7 fk:px-2.5 fk:text-xs\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => copyToClipboard(`Bearer ${trigger.secret ?? ''}`, setCopiedSecret)}\n >\n {copiedSecret ? <CheckIcon className=\"fk:size-3.5\" /> : <KeyRoundIcon className=\"fk:size-3.5\" />}\n Copy auth header\n </Button>\n ) : (\n <Button\n className=\"fk:h-7 fk:px-2.5 fk:text-xs\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => onChange({ ...trigger, secret: generateWebhookSecret() })}\n >\n <KeyRoundIcon className=\"fk:size-3.5\" />\n Generate auth header\n </Button>\n )}\n </div>\n );\n}\n\nfunction EntityTriggerRow({\n entities,\n onChange,\n trigger,\n}: {\n entities: string[];\n onChange: (_trigger: EntityFormTrigger) => void;\n trigger: EntityFormTrigger;\n}): JSX.Element {\n function toggleEvent(event: AutomationTriggerEvent): void {\n const events = trigger.events.includes(event)\n ? trigger.events.filter((current) => current !== event)\n : [...trigger.events, event];\n\n onChange({ ...trigger, events: TRIGGER_EVENTS.filter((current) => events.includes(current)) });\n }\n\n function toggleEntity(entity: string): void {\n const selected = trigger.entities.includes(entity)\n ? trigger.entities.filter((current) => current !== entity)\n : [...trigger.entities, entity];\n\n onChange({ ...trigger, entities: selected });\n }\n\n const entityLabel = trigger.entities.length > 0 ? trigger.entities.join(', ') : 'All entities';\n\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>On</span>\n <div className=\"fk:flex fk:items-center fk:gap-1\">\n {TRIGGER_EVENTS.map((event) => (\n <Button\n className=\"fk:h-7 fk:px-2.5 fk:text-xs fk:capitalize\"\n key={event}\n size=\"sm\"\n type=\"button\"\n variant={trigger.events.includes(event) ? 'secondary' : 'ghost'}\n onClick={() => toggleEvent(event)}\n >\n {trigger.events.includes(event) ? <CheckIcon className=\"fk:size-3\" /> : null}\n {event}\n </Button>\n ))}\n </div>\n <span>of</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-7 fk:max-w-60 fk:px-2.5 fk:text-xs\" size=\"sm\" type=\"button\" variant=\"outline\">\n <span className=\"fk:truncate\">{entityLabel}</span>\n <ChevronDownIcon className=\"fk:size-3.5 fk:opacity-50\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:max-h-64 fk:w-56 fk:overflow-auto\">\n {entities.length === 0 ? (\n <DropdownMenuItem disabled>No entities found in the project schema</DropdownMenuItem>\n ) : (\n entities.map((entity) => (\n <DropdownMenuCheckboxItem\n checked={trigger.entities.includes(entity)}\n key={entity}\n onCheckedChange={() => toggleEntity(entity)}\n onSelect={(event) => event.preventDefault()}\n >\n {entity}\n </DropdownMenuCheckboxItem>\n ))\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\nfunction TriggersField({\n entities,\n errors,\n onChange,\n projectId,\n triggers,\n}: {\n entities: string[];\n errors: { [triggerKey: string]: string };\n onChange: (_triggers: FormTrigger[]) => void;\n projectId: string;\n triggers: FormTrigger[];\n}): JSX.Element {\n const hasWebhookTrigger = triggers.some((trigger) => trigger.type === 'webhook');\n\n function addTrigger(trigger: FormTrigger): void {\n onChange([...triggers, trigger]);\n }\n\n function addScheduleTrigger(cron: string): void {\n addTrigger({ cron, key: createTriggerKey(), timezone: getLocalTimezone(), type: 'schedule' });\n }\n\n function updateTrigger(updated: FormTrigger): void {\n onChange(triggers.map((trigger) => (trigger.key === updated.key ? updated : trigger)));\n }\n\n function removeTrigger(key: string): void {\n onChange(triggers.filter((trigger) => trigger.key !== key));\n }\n\n return (\n <div className=\"fk:rounded-lg fk:border fk:bg-muted/60 fk:dark:bg-muted/30\">\n {triggers.map((trigger) => (\n <Fragment key={trigger.key}>\n <div className=\"fk:group fk:rounded-md fk:m-1.5 fk:p-1.5 fk:hover:bg-muted\" key={trigger.key}>\n <div className=\"fk:flex fk:items-center fk:gap-3\">\n {trigger.type === 'schedule' ? (\n <ClockIcon className=\"fk:size-4 fk:shrink-0 fk:text-muted-foreground\" />\n ) : null}\n {trigger.type === 'webhook' ? (\n <WebhookIcon className=\"fk:size-4 fk:shrink-0 fk:text-muted-foreground\" />\n ) : null}\n {trigger.type === 'entity' ? (\n <DatabaseZapIcon className=\"fk:size-4 fk:shrink-0 fk:text-muted-foreground\" />\n ) : null}\n {trigger.type === 'schedule' ? <ScheduleTriggerRow trigger={trigger} onChange={updateTrigger} /> : null}\n {trigger.type === 'webhook' ? (\n <WebhookTriggerRow projectId={projectId} trigger={trigger} onChange={updateTrigger} />\n ) : null}\n {trigger.type === 'entity' ? (\n <EntityTriggerRow entities={entities} trigger={trigger} onChange={updateTrigger} />\n ) : null}\n <Button\n aria-label=\"Remove trigger\"\n className=\"fk:opacity-0 fk:group-hover:opacity-100\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => removeTrigger(trigger.key)}\n >\n <Trash2Icon className=\"fk:size-4 fk:text-muted-foreground\" />\n </Button>\n </div>\n {errors[trigger.key] ? (\n <div className=\"fk:mt-1 fk:pl-7\">\n <FieldError message={errors[trigger.key]} />\n </div>\n ) : null}\n </div>\n <Separator className=\"fk:h-4\" />\n </Fragment>\n ))}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className=\"fk:flex fk:w-full fk:items-center fk:gap-3 fk:rounded-b-lg fk:px-3 fk:py-3 fk:text-sm fk:text-muted-foreground hover:fk:bg-muted hover:fk:text-foreground\"\n type=\"button\"\n >\n <PlusIcon className=\"fk:size-4\" />\n Add Trigger\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-56\">\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <ClockIcon className=\"fk:mr-2 fk:size-4 fk:text-muted-foreground\" />\n Scheduled\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuItem onClick={() => addScheduleTrigger(HOURLY_CRON)}>Hourly</DropdownMenuItem>\n <DropdownMenuItem onClick={() => addScheduleTrigger(DEFAULT_DAILY_CRON)}>Daily</DropdownMenuItem>\n <DropdownMenuItem onClick={() => addScheduleTrigger(DEFAULT_WEEKLY_CRON)}>Weekly</DropdownMenuItem>\n <DropdownMenuItem onClick={() => addScheduleTrigger(DEFAULT_CUSTOM_CRON)}>Custom (cron)</DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n <DropdownMenuItem\n disabled={hasWebhookTrigger}\n onClick={() =>\n addTrigger({ key: createTriggerKey(), secret: null, token: crypto.randomUUID(), type: 'webhook' })\n }\n >\n <WebhookIcon className=\"fk:mr-2 fk:size-4 fk:text-muted-foreground\" />\n Webhook Triggered\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => addTrigger({ entities: [], events: ['create'], key: createTriggerKey(), type: 'entity' })}\n >\n <DatabaseZapIcon className=\"fk:mr-2 fk:size-4 fk:text-muted-foreground\" />\n Entity Events\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\nfunction SlackIcon(): JSX.Element {\n return (\n <svg\n aria-label=\"Slack\"\n className=\"fk:mt-1 fk:size-3.5 fk:text-muted-foreground\"\n fill=\"currentColor\"\n role=\"img\"\n viewBox=\"0 0 127 127\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M27.2 80c0 7.3-5.9 13.2-13.2 13.2C6.7 93.2.8 87.3.8 80c0-7.3 5.9-13.2 13.2-13.2h13.2V80zm6.6 0c0-7.3 5.9-13.2 13.2-13.2 7.3 0 13.2 5.9 13.2 13.2v33c0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V80z\" />\n <path d=\"M47 27c-7.3 0-13.2-5.9-13.2-13.2C33.8 6.5 39.7.6 47 .6c7.3 0 13.2 5.9 13.2 13.2V27H47zm0 6.7c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H13.9C6.6 60.1.7 54.2.7 46.9c0-7.3 5.9-13.2 13.2-13.2H47z\" />\n <path d=\"M99.9 46.9c0-7.3 5.9-13.2 13.2-13.2 7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H99.9V46.9zm-6.6 0c0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V13.8C66.9 6.5 72.8.6 80.1.6c7.3 0 13.2 5.9 13.2 13.2v33.1z\" />\n <path d=\"M80.1 99.8c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V99.8h13.2zm0-6.6c-7.3 0-13.2-5.9-13.2-13.2 0-7.3 5.9-13.2 13.2-13.2h33.1c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H80.1z\" />\n </svg>\n );\n}\n\nfunction TeamsIcon(): JSX.Element {\n return (\n <svg\n aria-label=\"Microsoft Teams\"\n className=\"fk:mt-1 fk:size-3.5 fk:text-muted-foreground\"\n fill=\"currentColor\"\n role=\"img\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M15.5 5A3 3 0 0 1 14 7.599V7.5a2 2 0 0 0-2-2H9.541A3 3 0 1 1 15.5 5Zm6.25 1a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-3.294 11.732A3.25 3.25 0 0 0 23 14.75v-4.361a.889.889 0 0 0-.889-.889h-3.879c.17.294.268.636.268 1V17c0 .248-.015.492-.044.732ZM8.169 19.5A5 5 0 0 0 17.5 17v-6.5a1 1 0 0 0-1-1H14v8a2 2 0 0 1-2 2H8.169Z\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M1 17.5v-10a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1Zm6.75-6.75H9.5v-1.5h-5v1.5h1.75v4.75h1.5v-4.75Z\"\n fillRule=\"evenodd\"\n />\n </svg>\n );\n}\n\nexport function AutomationForm({ api, automation, mode, onSaved, projectId }: AutomationFormProps): JSX.Element {\n const [name, setName] = useState(automation?.name ?? '');\n const [instructions, setInstructions] = useState(automation?.instructions ?? '');\n const [enabled, setEnabled] = useState(automation?.enabled ?? false);\n const [modelId, setModelId] = useState(automation?.modelId ?? '');\n const [triggers, setTriggers] = useState<FormTrigger[]>(() => getInitialTriggers(automation));\n const [isSaving, setIsSaving] = useState(false);\n const [message, setMessage] = useState('');\n const [touched, setTouched] = useState({ instructions: false, name: false });\n const [toolsFormData, setToolsFormData] = useState<AutomationToolsFormData | null>(null);\n const toolsUrl = paths(projectId).tools(automation?.id);\n const { data: toolsData } = useSWR<ToolsResponse>(toolsUrl, fetcher);\n const { data: entitiesData } = useSWR<{ entities: string[] }>(paths(projectId).entities, fetcher);\n const modelOptions = useMemo(\n () => getModelOptions(toolsData?.tools.models ?? [], mode, modelId || automation?.modelId || ''),\n [automation?.modelId, mode, modelId, toolsData?.tools.models]\n );\n const effectiveModelId = modelId || modelOptions[0]?.id || '';\n const validation = useMemo<FormValidation>(() => {\n const triggerErrors: { [triggerKey: string]: string } = {};\n\n for (const trigger of triggers) {\n if (trigger.type === 'schedule') {\n const cronError = getCronError(trigger.cron, trigger.timezone);\n\n if (cronError) {\n triggerErrors[trigger.key] = cronError;\n }\n }\n\n if (trigger.type === 'entity' && trigger.events.length === 0) {\n triggerErrors[trigger.key] = 'Select at least one event (create, update or delete)';\n }\n }\n\n const toolErrors: { [provider: string]: string } = {};\n\n for (const provider of TOOL_PROVIDERS) {\n const tool = toolsFormData?.[provider];\n\n if (tool?.enabled && tool.channels.length === 0) {\n toolErrors[provider] =\n `Select at least one ${provider === 'slack' ? 'Slack' : 'Teams'} channel or remove the tool`;\n }\n }\n\n return {\n instructions: instructions.trim() ? '' : 'Instructions are required',\n model: effectiveModelId ? '' : 'Select a model',\n name: name.trim() ? '' : 'Name is required',\n toolErrors,\n triggerErrors,\n };\n }, [effectiveModelId, instructions, name, toolsFormData, triggers]);\n const isValid = isFormValidationClean(validation);\n const showNameError = touched.name && Boolean(validation.name);\n const showInstructionsError = touched.instructions && Boolean(validation.instructions);\n\n useEffect(() => {\n if (!toolsData?.tools) {\n return;\n }\n\n setToolsFormData(getInitialToolsFormData(toolsData.tools, mode));\n }, [automation?.id, mode, toolsData?.tools]);\n\n const loadProviderChannels = useCallback(\n async (provider: AutomationToolProvider): Promise<void> => {\n setToolsFormData((current) => {\n if (!current) {\n return current;\n }\n\n return {\n ...current,\n [provider]: {\n ...current[provider],\n channelsLoadError: undefined,\n loadingChannels: true,\n },\n };\n });\n\n try {\n const result = await api.listChannels(provider);\n const loadErrorMessage = result.success\n ? undefined\n : (result.errorMessage ?? `Failed to load ${provider === 'slack' ? 'Slack' : 'Teams'} channels.`);\n\n setToolsFormData((current) => {\n if (!current) {\n return current;\n }\n\n return {\n ...current,\n [provider]: {\n ...current[provider],\n availableChannels: mergeChannels(current[provider].channels, result.channels),\n channelsLoadError: loadErrorMessage,\n channelsLoaded: true,\n loadingChannels: false,\n },\n };\n });\n } catch (error) {\n const loadErrorMessage = error instanceof Error ? error.message : 'Failed to load integration channels.';\n\n setToolsFormData((current) => {\n if (!current) {\n return current;\n }\n\n return {\n ...current,\n [provider]: {\n ...current[provider],\n channelsLoadError: loadErrorMessage,\n channelsLoaded: true,\n loadingChannels: false,\n },\n };\n });\n }\n },\n [api]\n );\n\n useEffect(() => {\n if (!toolsFormData) {\n return;\n }\n\n for (const provider of TOOL_PROVIDERS) {\n const tool = toolsFormData[provider];\n\n if (tool.connected && !tool.channelsLoaded && !tool.loadingChannels) {\n void loadProviderChannels(provider);\n }\n }\n }, [loadProviderChannels, toolsFormData]);\n\n function updateTool(provider: AutomationToolProvider, value: Partial<AutomationProviderToolFormData>): void {\n setToolsFormData((current) => {\n if (!current) {\n return current;\n }\n\n return {\n ...current,\n [provider]: {\n ...current[provider],\n ...value,\n },\n };\n });\n }\n\n function handleRemoveTool(provider: AutomationToolProvider): void {\n updateTool(provider, {\n channels: [],\n enabled: false,\n });\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>): Promise<void> {\n event.preventDefault();\n\n if (!isValid) {\n setTouched({ instructions: true, name: true });\n\n return;\n }\n\n setIsSaving(true);\n setMessage('');\n\n const toolConfigs: AutomationToolConfigInput[] = TOOL_PROVIDERS.map((provider) => {\n const providerTools = toolsFormData?.[provider] ?? toolsData?.tools.providers[provider];\n\n return {\n channels: providerTools?.channels ?? [],\n enabled: providerTools?.enabled ?? false,\n provider,\n };\n });\n const input: AutomationInput = {\n enabled,\n instructions,\n modelId: effectiveModelId,\n name,\n toolConfigs,\n triggers: triggers.map(({ key: _key, ...trigger }) => trigger),\n };\n\n try {\n const result =\n mode === 'create' || !automation\n ? await api.createAutomation(input)\n : await api.updateAutomation(automation.id, input);\n\n if (!result.success) {\n setMessage(Array.isArray(result.errorMessage) ? result.errorMessage.join(', ') : result.errorMessage);\n\n return;\n }\n\n toast.success(mode === 'create' || !automation ? 'Automation created.' : 'Automation saved.');\n onSaved(result.automation);\n } catch (error) {\n setMessage(error instanceof Error ? error.message : 'Failed to save automation.');\n } finally {\n setIsSaving(false);\n }\n }\n\n return (\n <form className=\"fk:max-w-3xl fk:space-y-8 fk:px-1 fk:mx-auto\" onSubmit={(event) => void handleSubmit(event)}>\n {message ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-3 fk:text-sm fk:text-destructive\">\n {message}\n </div>\n ) : null}\n\n <div className=\"fk:space-y-3\">\n <Label className=\"fk:mb-1\">Status</Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-1\">\n Disabling an automation stops its schedules and ignores webhook calls and entity events\n </p>\n <div className=\"fk:flex fk:h-10 fk:items-center fk:gap-2\">\n <Switch checked={enabled} id=\"automation-enabled\" onCheckedChange={setEnabled} />\n <Label className=\"fk:font-normal\" htmlFor=\"automation-enabled\">\n {enabled ? 'Active' : 'Inactive'}\n </Label>\n </div>\n </div>\n\n <div className=\"fk:space-y-3\">\n <Label className=\"fk:mb-1\" htmlFor=\"automation-name\">\n Name\n </Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-2\">Identifying label for this automation</p>\n <Input\n aria-describedby={showNameError ? 'automation-name-error' : undefined}\n aria-invalid={showNameError}\n className={showNameError ? 'fk:border-destructive focus-visible:fk:ring-destructive' : ''}\n id=\"automation-name\"\n value={name}\n onBlur={() => setTouched((current) => ({ ...current, name: true }))}\n onChange={(event) => setName(event.target.value)}\n />\n {showNameError ? <FieldError id=\"automation-name-error\" message={validation.name} /> : null}\n </div>\n\n <div className=\"fk:space-y-3\">\n <Label className=\"fk:mb-1\">Triggers</Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-2\">\n When this automation should run. Schedules run in your timezone; webhooks run when their URL is called.\n </p>\n <TriggersField\n entities={entitiesData?.entities ?? []}\n errors={validation.triggerErrors}\n projectId={projectId}\n triggers={triggers}\n onChange={setTriggers}\n />\n </div>\n\n <div className=\"fk:space-y-3\">\n <Label className=\"fk:mb-1\" htmlFor=\"automation-instructions\">\n Agent instructions\n </Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-2\">\n Natural-language instructions the agent follows on every run. Be specific about entities, conditions, and the\n expected outcome.\n </p>\n <div>\n <div\n className={`fk:rounded-t-md fk:border-x fk:border-t fk:bg-muted/60 fk:ring-offset-background focus-within:fk:ring-2 focus-within:fk:ring-ring focus-within:fk:ring-offset-2 fk:dark:bg-muted/30 ${showInstructionsError ? 'fk:border-destructive' : 'fk:border-input'}`}\n >\n <Textarea\n aria-describedby={showInstructionsError ? 'automation-instructions-error' : undefined}\n aria-invalid={showInstructionsError}\n className=\"fk:flex fk:min-h-[160px] fk:max-h-[320px] fk:w-full fk:rounded-none fk:border-0 fk:bg-transparent fk:dark:bg-transparent fk:pb-11 fk:shadow-none focus-visible:fk:ring-0 focus-visible:fk:ring-offset-0 fk:mask-[linear-gradient(to_bottom,black_calc(100%-2.75rem),#0009_calc(100%-1.25rem),#0003_calc(100%-0.5rem),transparent)]\"\n id=\"automation-instructions\"\n placeholder=\"Describe what the agent should do on each run, e.g. 'When a new Review is created, translate the text to English, run a sentiment analysis and store the result in the sentiment attribute...'\"\n rows={8}\n value={instructions}\n onBlur={() => setTouched((current) => ({ ...current, instructions: true }))}\n onChange={(event) => setInstructions(event.target.value)}\n />\n </div>\n <div\n className={`fk:rounded-b-md fk:border-x fk:border-b fk:bg-muted/60 fk:dark:bg-muted/30 fk:px-2 fk:py-2 ${showInstructionsError ? 'fk:border-destructive' : 'fk:border-input'}`}\n >\n <Select value={effectiveModelId} onValueChange={setModelId}>\n <SelectTrigger\n aria-label=\"Model\"\n className=\"fk:w-fit fk:border-transparent fk:bg-background/90 fk:px-2.5 fk:py-0 fk:text-xs fk:shadow-sm hover:fk:border-border\"\n size=\"sm\"\n >\n <SelectValue placeholder=\"Select a model\" />\n </SelectTrigger>\n <SelectContent align=\"start\">\n {modelOptions.map((model) => (\n <SelectItem key={model.id} value={model.id}>\n {model.name}\n {model.deprecated ? ' (Legacy)' : ''}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n {showInstructionsError ? (\n <FieldError id=\"automation-instructions-error\" message={validation.instructions} />\n ) : null}\n {toolsData && validation.model ? <FieldError message={validation.model} /> : null}\n </div>\n\n <div className=\"fk:space-y-4\">\n <div>\n <Label className=\"fk:text-sm fk:font-medium\">Tools</Label>\n <p className=\"fk:mb-3 fk:text-xs fk:text-muted-foreground\">\n Configure additional destinations and built-in capabilities for this automation.\n </p>\n </div>\n <div className=\"fk:rounded-lg fk:border fk:bg-muted/60 fk:dark:bg-muted/30\">\n <div className=\"fk:rounded-t-lg\">\n <div className=\"fk:m-1.5 fk:flex fk:items-start fk:justify-between fk:gap-3 fk:rounded-md fk:p-1.5 fk:hover:bg-muted\">\n <div className=\"fk:flex fk:gap-3 fk:pb-0.5\">\n <BrainIcon className=\"fk:mt-1 fk:size-3.5 fk:text-muted-foreground\" />\n <div>\n <div className=\"fk:text-sm fk:font-medium\">Memories</div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Builds memory across runs to make automations smarter over time\n </p>\n </div>\n </div>\n <Badge className=\"fk:mt-1.5 fk:py-0 fk:text-[10px] fk:font-light fk:tracking-wide\" variant=\"secondary\">\n Always on\n </Badge>\n </div>\n </div>\n\n {toolsFormData ? (\n TOOL_PROVIDERS.map((provider) => {\n const tool = toolsFormData[provider];\n const providerLabel = provider === 'slack' ? 'Send to Slack' : 'Send to Microsoft Teams';\n const Icon = provider === 'slack' ? SlackIcon : TeamsIcon;\n\n return (\n <div className=\"fk:m-1.5 fk:space-y-2 fk:rounded-md fk:p-1.5 fk:hover:bg-muted\" key={provider}>\n <div className=\"fk:flex fk:items-center fk:justify-between fk:gap-3\">\n <div className=\"fk:flex fk:gap-3\">\n <Icon />\n <div>\n <div className=\"fk:text-sm fk:font-medium\">{providerLabel}</div>\n {tool.workspaceName ? (\n <p className=\"fk:text-xs fk:text-muted-foreground\">Connected to {tool.workspaceName}</p>\n ) : null}\n </div>\n </div>\n {tool.connected ? (\n tool.enabled ? (\n <Button\n aria-label={`Remove ${provider === 'slack' ? 'Slack' : 'Microsoft Teams'} from automation`}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => handleRemoveTool(provider)}\n >\n <Trash2Icon className=\"fk:size-4 fk:text-muted-foreground\" />\n </Button>\n ) : (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => updateTool(provider, { enabled: true })}\n >\n Add\n </Button>\n )\n ) : (\n <Button\n disabled={!toolsData?.tools.teamId}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n const teamId = toolsData?.tools.teamId;\n\n if (!teamId) {\n return;\n }\n\n window.open(api.getIntegrationManageUrl(teamId), '_blank', 'noopener,noreferrer');\n }}\n >\n Manage\n </Button>\n )}\n </div>\n {!tool.connected ? (\n <p className=\"fk:pl-7 fk:text-xs fk:text-muted-foreground\">\n Connect {provider === 'slack' ? 'Slack' : 'Microsoft Teams'} in Project Integrations before using\n it in an automation.\n </p>\n ) : null}\n {tool.connected && tool.enabled ? (\n <div className=\"fk:space-y-2 fk:pl-7\">\n <Label className=\"fk:mr-3 fk:text-xs fk:font-medium\">Channels</Label>\n <ChannelPicker\n channels={tool.availableChannels}\n disabled={tool.loadingChannels}\n loading={tool.loadingChannels}\n provider={provider}\n value={tool.channels}\n onChange={(channels) => updateTool(provider, { channels })}\n onRefresh={() => {\n void loadProviderChannels(provider);\n }}\n />\n {tool.channelsLoadError ? (\n <p className=\"fk:flex fk:items-start fk:text-sm fk:text-warning fk:gap-1\">\n <TriangleAlertIcon className=\"fk:size-4 fk:shrink-0 fk:mt-0.5\" />\n {tool.channelsLoadError}\n </p>\n ) : null}\n {!tool.channelsLoadError && validation.toolErrors[provider] ? (\n <FieldError message={validation.toolErrors[provider]} />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n })\n ) : (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:p-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircleIcon className=\"fk:size-4 fk:animate-spin\" />\n Loading tools...\n </div>\n )}\n </div>\n </div>\n\n <div className=\"fk:flex fk:items-center fk:justify-end fk:gap-3\">\n {!isValid ? (\n <span className=\"fk:text-xs fk:text-muted-foreground\">Complete the required fields to save</span>\n ) : null}\n <Button disabled={isSaving || !isValid} type=\"submit\">\n {isSaving ? 'Saving...' : mode === 'create' ? 'Create automation' : 'Update automation'}\n </Button>\n </div>\n </form>\n );\n}\n","import type { JSX } from 'react';\nimport type { TextUIPart, UIMessage, UIMessageChunk } from 'ai';\nimport { useEffect, useMemo, useRef, useState, useTransition } from 'react';\nimport { parseJsonEventStream, readUIMessageStream, uiMessageChunkSchema } from 'ai';\nimport { format, formatDistance } from 'date-fns';\nimport {\n ArrowLeft,\n BotIcon,\n BrainIcon,\n CheckCircle2Icon,\n CheckIcon,\n CircleSlashIcon,\n CloudUploadIcon,\n CoinsIcon,\n DatabaseZapIcon,\n DownloadIcon,\n Ellipsis,\n FileTextIcon,\n LoaderCircle,\n MessageSquareIcon,\n Pencil,\n Play,\n Plus,\n SearchIcon,\n SendIcon,\n TerminalIcon,\n Trash2,\n XCircleIcon,\n XIcon,\n ZapIcon,\n} from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport { useConfig } from '@flexkit/studio';\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n ExternalLink,\n ScrollArea,\n Separator,\n SidebarTrigger,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@flexkit/studio/ui';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { createApiClient, fetcher, paths } from './api';\nimport { AutomationForm } from './form';\nimport type { Automation, AutomationCreditBalance, AutomationRun, RunHistory } from './types';\n\ninterface AutomationsResponse {\n automations: Automation[];\n}\n\ninterface AutomationResponse {\n automation: Automation;\n}\n\ninterface RunsResponse {\n hasMore?: boolean;\n runs: AutomationRun[];\n}\n\ninterface RunResponse {\n run: AutomationRun;\n}\n\ninterface HistoryResponse {\n history: RunHistory;\n}\n\ninterface CreditResponse {\n creditBalance: AutomationCreditBalance;\n}\n\nfunction useProjectApi() {\n const { currentProjectId } = useConfig();\n const api = useMemo(() => (currentProjectId ? createApiClient(currentProjectId) : null), [currentProjectId]);\n\n return { api, projectId: currentProjectId };\n}\n\nfunction PageMessage({ children }: { children: string }): JSX.Element {\n return (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:p-8 fk:text-center fk:text-sm fk:text-muted-foreground\">\n {children}\n </div>\n );\n}\n\nfunction StatusBadge({ status }: { status: string }): JSX.Element {\n return (\n <Badge\n className={`fk:border-none fk:h-[19px] fk:text-[0.6875rem] fk:leading-4.5 fk:tracking-wide ${status === 'success' ? 'fk:bg-success/20 fk:text-success' : 'fk:bg-secondary fk:text-secondary-foreground'}`}\n variant={status === 'success' ? 'default' : 'secondary'}\n >\n {status}\n </Badge>\n );\n}\n\nfunction getScheduleSummary(cron: string): string {\n if (cron === '0 * * * *') {\n return 'Every hour';\n }\n\n const daily = /^0 (\\d{1,2}) \\* \\* \\*$/.exec(cron);\n\n if (daily) {\n return `Every day at ${daily[1].padStart(2, '0')}:00`;\n }\n\n const weekly = /^0 (\\d{1,2}) \\* \\* ([0-6])$/.exec(cron);\n\n if (weekly) {\n const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\n return `Every ${days[Number(weekly[2])] ?? 'week'} at ${weekly[1].padStart(2, '0')}:00`;\n }\n\n return cron;\n}\n\nfunction getTriggerSummary(automation: Automation): string {\n const summaries = automation.triggers.map((trigger) => {\n if (trigger.type === 'schedule') {\n return getScheduleSummary(trigger.cron);\n }\n\n if (trigger.type === 'webhook') {\n return 'Webhook';\n }\n\n const entities = trigger.entities.length > 0 ? trigger.entities.join(', ') : 'all entities';\n\n return `On ${trigger.events.join('/')} of ${entities}`;\n });\n\n if (summaries.length === 0) {\n return 'Manual only';\n }\n\n return summaries.join(' · ');\n}\n\nfunction isAutomationRunnable(automation?: Automation): boolean {\n if (!automation) {\n return false;\n }\n\n return Boolean(automation.name.trim() && automation.instructions.trim() && automation.modelId.trim());\n}\n\nfunction CreditButton({ projectId }: { projectId: string }): JSX.Element | null {\n const { data } = useSWR<CreditResponse>(paths(projectId).creditBalance, fetcher);\n const creditBalance = data?.creditBalance;\n\n if (!creditBalance) {\n return null;\n }\n\n return (\n <Button asChild size=\"sm\" variant=\"secondary\">\n <a href={creditBalance.billingUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n <CoinsIcon className=\"fk:mr-2 fk:size-4\" />\n {creditBalance.display} Credit\n </a>\n </Button>\n );\n}\n\nexport function AutomationsPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const navigate = useNavigate();\n const { data, mutate } = useSWR<AutomationsResponse>(projectId ? paths(projectId).automations : null, fetcher);\n const [message, setMessage] = useState('');\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to view automations.</PageMessage>;\n }\n\n const automations = [...(data?.automations ?? [])].sort((a, b) => {\n const aTime = a.lastRunAt ? new Date(a.lastRunAt).getTime() : 0;\n const bTime = b.lastRunAt ? new Date(b.lastRunAt).getTime() : 0;\n\n return bTime - aTime;\n });\n\n async function handleDelete(automation: Automation): Promise<void> {\n setMessage('');\n\n if (!api) {\n return;\n }\n\n const result = await api.deleteAutomation(automation.id);\n\n if (!result.success) {\n setMessage(Array.isArray(result.errorMessage) ? result.errorMessage.join(', ') : result.errorMessage);\n\n return;\n }\n\n await mutate();\n }\n\n return (\n <div className=\"fk:space-y-6 fk:h-full\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Automations</h1>\n <p className=\"fk:mt-1 fk:text-sm fk:text-muted-foreground\">\n Agent-powered tasks that run on a schedule or when your data changes.\n <ExternalLink href=\"https://flexkit.io/docs/automations\">Learn more</ExternalLink>\n </p>\n </div>\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:justify-end fk:gap-3\">\n <CreditButton projectId={projectId} />\n <Button asChild size=\"sm\">\n <Link to=\"new\">\n <Plus className=\"fk:mr-2 fk:size-4\" />\n New Automation\n </Link>\n </Button>\n </div>\n </div>\n\n {message ? <div className=\"fk:text-sm fk:text-destructive\">{message}</div> : null}\n\n {automations.length === 0 ? (\n <PageMessage>No automations yet.</PageMessage>\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Automation</TableHead>\n <TableHead>Triggers</TableHead>\n <TableHead>Last run</TableHead>\n <TableHead className=\"fk:text-center\">Runs</TableHead>\n <TableHead className=\"fk:text-center\">Status</TableHead>\n <TableHead />\n </TableRow>\n </TableHeader>\n <TableBody>\n {automations.map((automation) => (\n <TableRow className=\"fk:cursor-pointer\" key={automation.id} onClick={() => navigate(automation.id)}>\n <TableCell>\n <div className=\"fk:font-medium\">{automation.name}</div>\n </TableCell>\n <TableCell className=\"fk:text-muted-foreground\">{getTriggerSummary(automation)}</TableCell>\n <TableCell>\n {automation.lastRunAt\n ? formatDistance(new Date(automation.lastRunAt), new Date(), { addSuffix: true })\n : 'Never'}\n </TableCell>\n <TableCell className=\"fk:text-center\">{automation.totalRuns}</TableCell>\n <TableCell className=\"fk:text-center\">\n <Badge\n className={`fk:border-none fk:h-[19px] fk:text-[0.6875rem] fk:leading-4.5 fk:tracking-wide ${automation.enabled ? 'fk:bg-success/20 fk:text-success' : 'fk:bg-secondary fk:text-secondary-foreground'}`}\n variant={automation.enabled ? 'default' : 'secondary'}\n >\n {automation.enabled ? 'Enabled' : 'Disabled'}\n </Badge>\n </TableCell>\n <TableCell className=\"fk:text-right\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${automation.name}`}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <Ellipsis className=\"fk:size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-40\">\n <DropdownMenuItem\n onClick={(event) => {\n event.stopPropagation();\n navigate(automation.id);\n }}\n >\n <Pencil />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n variant=\"destructive\"\n onClick={(event) => {\n event.stopPropagation();\n void handleDelete(automation);\n }}\n >\n <Trash2 />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </div>\n );\n}\n\nexport function CreateAutomationPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const navigate = useNavigate();\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to create automations.</PageMessage>;\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">New Automation</h1>\n </div>\n </div>\n <Button asChild className=\"fk:shrink-0 fk:w-fit\" size=\"sm\" variant=\"ghost\">\n <Link to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Automations\n </Link>\n </Button>\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4\">\n <AutomationForm api={api} mode=\"create\" projectId={projectId} onSaved={() => navigate('..')} />\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nexport function AutomationDetailPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const { automationId } = useParams<{ automationId: string }>();\n const navigate = useNavigate();\n const [isRunning, startTransition] = useTransition();\n const { data, mutate } = useSWR<AutomationResponse>(\n projectId && automationId ? paths(projectId).automation(automationId) : null,\n fetcher\n );\n\n if (!projectId || !api || !automationId) {\n return <PageMessage>Select an automation.</PageMessage>;\n }\n\n if (!data?.automation) {\n return <PageMessage>Loading automation...</PageMessage>;\n }\n\n const automationApi = api;\n const canRunAutomation = isAutomationRunnable(data.automation);\n const selectedAutomationId = automationId;\n\n function handleRunNow(): void {\n if (!canRunAutomation) {\n return;\n }\n\n startTransition(async () => {\n const result = await automationApi.runAutomation(selectedAutomationId);\n\n if (result.success && result.runId) {\n navigate(`runs/${result.runId}`);\n\n return;\n }\n\n await mutate();\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">{data.automation.name}</h1>\n </div>\n </div>\n <div className=\"fk:flex fk:shrink-0 fk:flex-wrap fk:items-center fk:justify-between fk:gap-3\">\n <Button asChild size=\"sm\" variant=\"ghost\">\n <Link to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Automations\n </Link>\n </Button>\n <Tabs value=\"settings\">\n <TabsList>\n <TabsTrigger className=\"text-xs\" value=\"settings\">\n Settings\n </TabsTrigger>\n <TabsTrigger className=\"text-xs\" value=\"runs\">\n <Link to=\"runs\">Runs</Link>\n </TabsTrigger>\n </TabsList>\n </Tabs>\n <Button disabled={isRunning || !canRunAutomation} size=\"sm\" onClick={handleRunNow}>\n {isRunning ? (\n <LoaderCircle className=\"fk:mr-2 fk:size-4 fk:animate-spin\" />\n ) : (\n <Play className=\"fk:mr-2 fk:size-4\" />\n )}\n Run now\n </Button>\n </div>\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4\">\n <AutomationForm\n api={api}\n automation={data.automation}\n mode=\"edit\"\n projectId={projectId}\n onSaved={(automation) => {\n if (automation) {\n void mutate({ automation }, { revalidate: false });\n } else {\n void mutate();\n }\n }}\n />\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nconst RUNS_PAGE_SIZE = 25;\n\nexport function RunsPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const { automationId } = useParams<{ automationId: string }>();\n const navigate = useNavigate();\n const [isRunning, startTransition] = useTransition();\n const { data } = useSWR<AutomationResponse>(\n projectId && automationId ? paths(projectId).automation(automationId) : null,\n fetcher\n );\n const getRunsKey = (pageIndex: number, previousPage: RunsResponse | null): string | null => {\n if (!projectId || !automationId) {\n return null;\n }\n\n if (previousPage && previousPage.hasMore === false) {\n return null;\n }\n\n return paths(projectId).automationRuns(automationId, pageIndex * RUNS_PAGE_SIZE, RUNS_PAGE_SIZE);\n };\n const { data: runPages, mutate, setSize, size } = useSWRInfinite<RunsResponse>(getRunsKey, fetcher);\n\n if (!projectId || !api || !automationId) {\n return <PageMessage>Select an automation to view runs.</PageMessage>;\n }\n\n const automationApi = api;\n const canRunAutomation = isAutomationRunnable(data?.automation);\n const selectedAutomationId = automationId;\n\n function handleRunNow(): void {\n if (!canRunAutomation) {\n return;\n }\n\n startTransition(async () => {\n const result = await automationApi.runAutomation(selectedAutomationId);\n\n if (result.success && result.runId) {\n navigate(result.runId);\n\n return;\n }\n\n await mutate();\n });\n }\n\n const runs = runPages?.flatMap((page) => page.runs) ?? [];\n const lastPage = runPages?.[runPages.length - 1];\n const hasMore = lastPage?.hasMore ?? false;\n const isLoadingMore = runPages !== undefined && size > runPages.length;\n\n function handleLoadMore(): void {\n void setSize((currentSize) => currentSize + 1);\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {data?.automation.name ?? 'Automation'}\n </h1>\n </div>\n </div>\n <div className=\"fk:flex fk:shrink-0 fk:flex-wrap fk:items-center fk:justify-between fk:gap-3\">\n <Button asChild size=\"sm\" variant=\"ghost\">\n <Link to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Automations\n </Link>\n </Button>\n <Tabs value=\"runs\">\n <TabsList>\n <TabsTrigger className=\"text-xs\" value=\"settings\">\n <Link relative=\"path\" to=\"..\">\n Settings\n </Link>\n </TabsTrigger>\n <TabsTrigger className=\"text-xs\" value=\"runs\">\n Runs\n </TabsTrigger>\n </TabsList>\n </Tabs>\n <Button disabled={isRunning || !canRunAutomation} size=\"sm\" onClick={handleRunNow}>\n {isRunning ? (\n <LoaderCircle className=\"fk:mr-2 fk:size-4 fk:animate-spin\" />\n ) : (\n <Play className=\"fk:mr-2 fk:size-4\" />\n )}\n Run now\n </Button>\n </div>\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4\">\n <RunsTable basePath=\".\" runs={runs} />\n {hasMore && !isLoadingMore ? <InfiniteScrollSentinel onVisible={handleLoadMore} /> : null}\n {isLoadingMore ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Loading more runs...</span>\n </div>\n ) : null}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction InfiniteScrollSentinel({ onVisible }: { onVisible: () => void }): JSX.Element {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const onVisibleRef = useRef(onVisible);\n\n onVisibleRef.current = onVisible;\n\n useEffect(() => {\n const node = sentinelRef.current;\n\n if (!node) {\n return;\n }\n\n const observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n onVisibleRef.current();\n }\n });\n\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n return <div className=\"fk:h-px\" ref={sentinelRef} />;\n}\n\nfunction RunsTable({ basePath, runs }: { basePath: string; runs: AutomationRun[] }): JSX.Element {\n if (runs.length === 0) {\n return <PageMessage>No runs found.</PageMessage>;\n }\n\n return (\n <Table>\n <TableBody>\n {runs.map((run) => (\n <TableRow key={run.id}>\n <TableCell className=\"fk:py-2\">\n <Link className=\"fk:font-medium hover:fk:underline\" to={`${basePath}/${run.id}`}>\n {formatDistance(new Date(run.startedAt), new Date(), { addSuffix: true })}\n </Link>\n </TableCell>\n <TableCell className=\"fk:text-muted-foreground\">{run.triggerType}</TableCell>\n <TableCell>\n <StatusBadge status={run.status} />\n </TableCell>\n <TableCell className=\"fk:max-w-md fk:truncate fk:text-muted-foreground\">{run.summary ?? ''}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nexport function RunHistoryPage(): JSX.Element {\n const { projectId } = useProjectApi();\n const [scope, setScope] = useState<'mine' | 'team'>('team');\n const getHistoryKey = (pageIndex: number, previousPage: HistoryResponse | null): string | null => {\n if (!projectId) {\n return null;\n }\n\n if (previousPage && !previousPage.history.hasMore) {\n return null;\n }\n\n return paths(projectId).runHistory(scope, pageIndex * RUNS_PAGE_SIZE, RUNS_PAGE_SIZE);\n };\n const { data: historyPages, setSize, size } = useSWRInfinite<HistoryResponse>(getHistoryKey, fetcher);\n const metrics = historyPages?.[0]?.history.metrics;\n const runs = historyPages?.flatMap((page) => page.history.runs) ?? [];\n const lastPage = historyPages?.[historyPages.length - 1];\n const hasMore = lastPage?.history.hasMore ?? false;\n const isLoadingMore = historyPages !== undefined && size > historyPages.length;\n\n if (!projectId) {\n return <PageMessage>Select a project to view run history.</PageMessage>;\n }\n\n function handleLoadMore(): void {\n void setSize((currentSize) => currentSize + 1);\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-6\">\n <div className=\"fk:flex fk:shrink-0 fk:gap-2\">\n <Button size=\"sm\" variant={scope === 'team' ? 'default' : 'outline'} onClick={() => setScope('team')}>\n Team\n </Button>\n <Button size=\"sm\" variant={scope === 'mine' ? 'default' : 'outline'} onClick={() => setScope('mine')}>\n Mine\n </Button>\n </div>\n {metrics ? (\n <div className=\"fk:grid fk:shrink-0 fk:gap-3 fk:md:grid-cols-4\">\n <MetricCard title=\"Successful 24h\" value={metrics.successful24h} />\n <MetricCard title=\"Failed 24h\" value={metrics.failed24h} />\n <MetricCard title=\"Successful 7d\" value={metrics.successful7d} />\n <MetricCard title=\"Failed 7d\" value={metrics.failed7d} />\n </div>\n ) : null}\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4\">\n <RunsTable\n basePath=\"..\"\n runs={runs.map((run) => ({\n ...run,\n id: `${run.automationId}/runs/${run.id}`,\n }))}\n />\n {hasMore && !isLoadingMore ? <InfiniteScrollSentinel onVisible={handleLoadMore} /> : null}\n {isLoadingMore ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Loading more runs...</span>\n </div>\n ) : null}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction MetricCard({ title, value }: { title: string; value: number }): JSX.Element {\n return (\n <div className=\"fk:rounded-md fk:bg-muted/60 fk:p-4\">\n <div className=\"fk:text-sm fk:text-muted-foreground\">{title}</div>\n <div className=\"fk:mt-1 fk:text-2xl fk:font-medium\">{value.toLocaleString()}</div>\n </div>\n );\n}\n\ninterface ReplayMetadata {\n model?: string;\n}\n\ninterface ReplayError {\n message: string;\n}\n\ninterface ReplayDataParts {\n [key: string]: unknown;\n 'bulk-graphql-action': {\n changedItems?: number;\n failedItems?: number;\n jobId?: string;\n operationName: string;\n processedItems?: number;\n status: 'loading' | 'running' | 'done' | 'error';\n totalItems?: number;\n error?: ReplayError;\n };\n 'create-sandbox': {\n sandboxId?: string;\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'execute-graphql': {\n operationType?: 'query' | 'mutation';\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'generating-files': {\n paths: string[];\n status: 'generating' | 'uploading' | 'uploaded' | 'done' | 'error';\n error?: ReplayError;\n };\n 'run-artifact': {\n artifactId?: string;\n contentType?: string;\n filename: string;\n kind?: 'html' | 'pdf';\n sizeBytes?: number;\n status: 'uploading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'run-command': {\n args: string[];\n command: string;\n commandId?: string;\n exitCode?: number;\n sandboxId: string;\n status: 'executing' | 'running' | 'waiting' | 'done' | 'error';\n error?: ReplayError;\n };\n 'run-summary': {\n status: 'success' | 'skipped' | 'failed';\n summary: string;\n };\n 'search-schema': {\n query?: string;\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'tool-delivery': {\n channelId: string;\n channelName: string;\n provider: 'slack' | 'teams';\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'update-memory': {\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'user-message': {\n parts: ReplayMessagePart[];\n };\n 'validate-graphql': {\n errorCount?: number;\n status: 'loading' | 'valid' | 'invalid' | 'error';\n error?: ReplayError;\n };\n 'web-search': {\n query: string;\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n}\n\ninterface ReplayTools {\n [key: string]: {\n input: unknown;\n output: unknown | undefined;\n };\n}\n\ntype ReplayMessage = UIMessage<ReplayMetadata, ReplayDataParts, ReplayTools>;\ntype ReplayMessagePart = ReplayMessage['parts'][number];\ntype RunStreamStatus = 'streaming' | 'finished' | 'error' | 'unavailable';\ntype ConsumeOnceResult = 'finished' | 'incomplete' | 'unavailable';\n\nconst MAX_STREAM_ATTEMPTS = 5;\nconst STREAM_RETRY_DELAY_MS = 2000;\nconst JSON_RENDER_SPEC_PART_TYPE = 'data-spec';\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => window.setTimeout(resolve, ms));\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === 'AbortError' || error.message.toLowerCase().includes('aborted');\n}\n\nfunction hasRenderableParts(parts: ReplayMessagePart[]): boolean {\n return parts.some((part) => part.type !== 'step-start');\n}\n\nfunction getMarkerIds(messages: ReplayMessage[]): Set<string> {\n const markerIds = new Set<string>();\n\n for (const message of messages) {\n for (const part of message.parts) {\n if (part.type === 'data-user-message' && part.id) {\n markerIds.add(part.id);\n }\n }\n }\n\n return markerIds;\n}\n\nfunction splitSessionMessages(messages: ReplayMessage[]): ReplayMessage[] {\n const markerIds = getMarkerIds(messages);\n const result: ReplayMessage[] = [];\n\n for (const message of messages) {\n if (message.role === 'user') {\n if (!markerIds.has(message.id)) {\n result.push(message);\n }\n\n continue;\n }\n\n if (message.role !== 'assistant') {\n result.push(message);\n\n continue;\n }\n\n let parts: ReplayMessagePart[] = [];\n let chunkIndex = 0;\n\n const flush = (): void => {\n if (hasRenderableParts(parts)) {\n result.push({ ...message, id: `${message.id}-${chunkIndex.toString()}`, parts });\n }\n\n chunkIndex++;\n parts = [];\n };\n\n for (const part of message.parts) {\n if (part.type === 'data-user-message') {\n const data = getPartData<ReplayDataParts['user-message']>(part);\n\n flush();\n result.push({\n id: part.id ?? crypto.randomUUID(),\n parts: data.parts,\n role: 'user',\n });\n\n continue;\n }\n\n parts.push(part);\n }\n\n flush();\n }\n\n return result;\n}\n\nfunction useSessionMessages(messages: ReplayMessage[]): ReplayMessage[] {\n return useMemo(() => splitSessionMessages(messages), [messages]);\n}\n\nfunction getPartData<T>(part: ReplayMessagePart): T {\n return (part as { data: T }).data;\n}\n\nfunction useRunStream(\n streamApi: string,\n options?: { recordStatus?: AutomationRun['status'] | null }\n): {\n message: ReplayMessage | undefined;\n status: RunStreamStatus;\n} {\n const [message, setMessage] = useState<ReplayMessage>();\n const [status, setStatus] = useState<RunStreamStatus>('streaming');\n\n useEffect(() => {\n if (!streamApi) {\n setMessage(undefined);\n setStatus('unavailable');\n\n return;\n }\n\n const abortController = new AbortController();\n\n const consumeOnce = async (): Promise<ConsumeOnceResult> => {\n const response = await fetch(`${streamApi}?startIndex=0`, {\n credentials: 'include',\n signal: abortController.signal,\n });\n\n if (response.status === 404) {\n return 'unavailable';\n }\n\n if (!response.ok || !response.body) {\n throw new Error(`Failed to fetch the run stream (status ${response.status.toString()})`);\n }\n\n let sawFinish = false;\n const parsedStream = parseJsonEventStream({ schema: uiMessageChunkSchema, stream: response.body });\n type ParsedChunk = typeof parsedStream extends ReadableStream<infer T> ? T : never;\n\n const chunkStream = parsedStream.pipeThrough(\n new TransformStream<ParsedChunk, UIMessageChunk>({\n transform: (result, controller) => {\n if (!result.success) {\n throw result.error;\n }\n\n if (result.value.type === 'finish') {\n sawFinish = true;\n }\n\n controller.enqueue(result.value);\n },\n })\n );\n\n const messageStream = readUIMessageStream<ReplayMessage>({\n onError: (error) => {\n console.error('Automation run stream chunk error', error);\n },\n stream: chunkStream,\n });\n\n for await (const current of messageStream) {\n if (abortController.signal.aborted) {\n break;\n }\n\n setMessage({ ...current });\n }\n\n return sawFinish ? 'finished' : 'incomplete';\n };\n\n const consume = async (): Promise<void> => {\n for (let attempt = 0; attempt < MAX_STREAM_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n await delay(STREAM_RETRY_DELAY_MS);\n setMessage(undefined);\n }\n\n try {\n const result = await consumeOnce();\n\n if (abortController.signal.aborted) {\n return;\n }\n\n if (result === 'unavailable') {\n setStatus('unavailable');\n\n return;\n }\n\n if (result === 'finished') {\n setStatus('finished');\n\n return;\n }\n } catch (error) {\n if (abortController.signal.aborted || isAbortError(error)) {\n return;\n }\n\n console.error('Automation run stream error', error);\n }\n }\n\n setStatus(options?.recordStatus === 'running' ? 'streaming' : 'error');\n };\n\n const loadTimeout = window.setTimeout(() => {\n void consume();\n }, 0);\n\n return () => {\n window.clearTimeout(loadTimeout);\n abortController.abort('Run replay unmounted');\n };\n }, [options?.recordStatus, streamApi]);\n\n return { message, status };\n}\n\nexport function RunDetailPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const { automationId, runId } = useParams<{ automationId: string; runId: string }>();\n const { data, mutate } = useSWR<RunResponse>(projectId && runId ? paths(projectId).run(runId) : null, fetcher);\n const { data: automationData } = useSWR<AutomationResponse>(\n projectId && automationId ? paths(projectId).automation(automationId) : null,\n fetcher\n );\n const [isCancelling, startCancelTransition] = useTransition();\n\n if (!projectId || !api || !automationId || !runId) {\n return <PageMessage>Select a run.</PageMessage>;\n }\n\n const runApi = api;\n const selectedRunId = runId;\n const run = data?.run;\n\n function handleCancel(): void {\n startCancelTransition(async () => {\n await runApi.cancelRun(selectedRunId);\n await mutate();\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {automationData?.automation.name ?? 'Automation'}\n </h1>\n </div>\n </div>\n <div className=\"fk:flex fk:shrink-0 fk:flex-wrap fk:items-start fk:justify-between fk:gap-3\">\n <div>\n <Button asChild size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Runs\n </Link>\n </Button>\n <h2 className=\"fk:mt-4 fk:text-lg fk:font-medium\">\n {run ? `Run from ${format(new Date(run.startedAt), 'PPpp')}` : 'Loading run...'}\n </h2>\n </div>\n {run?.status === 'running' ? (\n <Button disabled={isCancelling} size=\"sm\" variant=\"destructive\" onClick={handleCancel}>\n {isCancelling ? 'Cancelling...' : 'Cancel run'}\n </Button>\n ) : null}\n </div>\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4 fk:max-w-5xl fk:mx-auto\">\n {run ? <RunReplay api={api} run={run} /> : <PageMessage>Loading run...</PageMessage>}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction RunReplay({ api, run }: { api: ReturnType<typeof createApiClient>; run: AutomationRun }): JSX.Element {\n const { workflowRunId } = run;\n const streamApi = workflowRunId ? api.getStreamUrl(workflowRunId) : '';\n const { message, status } = useRunStream(streamApi, { recordStatus: run.status });\n const rawMessages = useMemo(() => (message ? [message] : []), [message]);\n const messages = useSessionMessages(rawMessages);\n\n if (!workflowRunId) {\n return <PageMessage>The run has not started streaming yet.</PageMessage>;\n }\n\n return (\n <div className=\"fk:space-y-4\">\n {run.status === 'failed' && run.error ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-4 fk:text-sm\">\n {run.summary ?? run.error}\n </div>\n ) : null}\n {status === 'unavailable' ? (\n <div className=\"fk:rounded-md fk:border fk:border-amber-500/30 fk:bg-amber-500/5 fk:p-4 fk:text-sm\">\n The workflow replay is no longer available. Generated artifacts may still be available below.\n </div>\n ) : null}\n {status === 'error' && messages.length === 0 ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-4 fk:text-sm\">\n Failed to load the run stream. Try reloading the page.\n </div>\n ) : null}\n {messages.length > 0 ? (\n <div className=\"fk:space-y-5 fk:rounded-md fk:bg-background\">\n {messages.map((replayMessage) => (\n <ReplayMessage key={replayMessage.id} api={api} message={replayMessage} />\n ))}\n {status === 'streaming' ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:font-mono fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Running...</span>\n </div>\n ) : null}\n </div>\n ) : (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:rounded-md fk:border fk:border-dashed fk:p-8 fk:font-mono fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>{status === 'unavailable' ? 'No replay events were recorded.' : 'Loading run replay...'}</span>\n </div>\n )}\n </div>\n );\n}\n\nfunction ReplayMessage({\n api,\n message,\n}: {\n api: ReturnType<typeof createApiClient>;\n message: ReplayMessage;\n}): JSX.Element {\n const isUser = message.role === 'user';\n\n return (\n <div className={isUser ? 'fk:ml-auto fk:w-full fk:max-w-[70%]' : 'fk:w-full fk:min-w-0'}>\n <div className=\"fk:mb-2 fk:flex fk:items-center fk:gap-2 fk:font-mono fk:text-sm fk:font-medium fk:text-primary\">\n {isUser ? (\n <>\n <ZapIcon className=\"fk:ml-auto fk:size-4\" />\n <span>Trigger</span>\n </>\n ) : (\n <>\n <BotIcon className=\"fk:size-4\" />\n <span>Agent{message.metadata?.model ? ` (${message.metadata.model})` : ''}</span>\n </>\n )}\n </div>\n <div className=\"fk:space-y-3 fk:min-w-0\">\n {message.parts.map((part, index) => (\n <MessagePart api={api} key={index} part={part} partIndex={index} parts={message.parts} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction MessagePart({\n api,\n part,\n partIndex,\n parts,\n}: {\n api: ReturnType<typeof createApiClient>;\n part: ReplayMessagePart;\n partIndex: number;\n parts: ReplayMessagePart[];\n}): JSX.Element | null {\n if (part.type === 'step-start') {\n return null;\n }\n\n if (part.type === 'text') {\n return <TextPart part={part} />;\n }\n\n if (part.type === 'reasoning') {\n return <ReasoningPart text={part.text} />;\n }\n\n if (part.type === 'data-generating-files') {\n return <GenerateFilesPart message={getPartData<ReplayDataParts['generating-files']>(part)} />;\n }\n\n if (part.type === 'data-run-artifact') {\n return <RunArtifactPart api={api} message={getPartData<ReplayDataParts['run-artifact']>(part)} />;\n }\n\n if (part.type === 'data-tool-delivery') {\n return <ToolDeliveryPart message={getPartData<ReplayDataParts['tool-delivery']>(part)} />;\n }\n\n if (part.type === 'data-run-summary') {\n return <RunSummaryPart message={getPartData<ReplayDataParts['run-summary']>(part)} />;\n }\n\n if (part.type === 'data-run-command') {\n const data = getPartData<ReplayDataParts['run-command']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<TerminalIcon className=\"fk:size-3.5\" />}\n loading={['executing', 'running', 'waiting'].includes(data.status)}\n message={\n data.status === 'error'\n ? (data.error?.message ?? `Command failed: ${data.command}`)\n : `${data.status === 'done' ? 'Ran' : 'Running'} ${data.command} ${data.args.join(' ')}`\n }\n title=\"Run command\"\n />\n );\n }\n\n if (part.type === 'data-search-schema') {\n const data = getPartData<ReplayDataParts['search-schema']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<SearchIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? 'Failed to search schema')\n : `${data.status === 'done' ? 'Searched' : 'Searching'}${data.query ? ` \"${data.query}\"` : ' schema'}`\n }\n title=\"Search schema\"\n />\n );\n }\n\n if (part.type === 'data-web-search') {\n const data = getPartData<ReplayDataParts['web-search']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<SearchIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? 'Failed to search the web')\n : `${data.status === 'done' ? 'Searched' : 'Searching'} \"${data.query}\"`\n }\n title=\"Web search\"\n />\n );\n }\n\n if (part.type === 'data-validate-graphql') {\n const data = getPartData<ReplayDataParts['validate-graphql']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<DatabaseZapIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={getValidateGraphqlMessage(data)}\n title=\"Validate GraphQL\"\n />\n );\n }\n\n if (part.type === 'data-execute-graphql') {\n const data = getPartData<ReplayDataParts['execute-graphql']>(part);\n const operationLabel = data.operationType === 'mutation' ? 'mutation' : 'query';\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<DatabaseZapIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? `Failed to execute ${operationLabel}`)\n : `${data.status === 'done' ? 'Executed' : 'Executing'} ${operationLabel}`\n }\n title=\"Execute GraphQL\"\n />\n );\n }\n\n if (part.type === 'data-bulk-graphql-action') {\n return <BulkGraphqlActionPart message={getPartData<ReplayDataParts['bulk-graphql-action']>(part)} />;\n }\n\n if (part.type === 'data-update-memory') {\n const data = getPartData<ReplayDataParts['update-memory']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<CheckCircle2Icon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? 'Failed to update memory')\n : data.status === 'done'\n ? 'Updated automation memory'\n : 'Updating automation memory'\n }\n title=\"Update memory\"\n />\n );\n }\n\n if (part.type === 'data-create-sandbox') {\n const data = getPartData<ReplayDataParts['create-sandbox']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<TerminalIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? 'Failed to create sandbox')\n : data.status === 'done'\n ? 'Created sandbox'\n : 'Creating sandbox'\n }\n title=\"Create sandbox\"\n />\n );\n }\n\n if (part.type === JSON_RENDER_SPEC_PART_TYPE) {\n const nextSpecPart = parts.slice(partIndex + 1).find((nextPart) => nextPart.type === JSON_RENDER_SPEC_PART_TYPE);\n\n if (nextSpecPart) {\n return null;\n }\n\n return (\n <ToolMessage>\n <ToolHeader>\n <CheckCircle2Icon className=\"fk:size-3.5\" />\n Generated visual spec\n </ToolHeader>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n A structured json-render response was generated for this run.\n </p>\n </ToolMessage>\n );\n }\n\n if (part.type.startsWith('data-')) {\n return <UnknownDataPart part={part} />;\n }\n\n return null;\n}\n\nfunction TextPart({ part }: { part: TextUIPart }): JSX.Element {\n return (\n <div className=\"fk:min-w-0 fk:max-w-full fk:overflow-x-auto fk:whitespace-pre-wrap fk:rounded-xl fk:bg-muted fk:px-4 fk:py-3 fk:text-sm fk:font-light fk:leading-relaxed fk:text-secondary-foreground\">\n {part.text}\n </div>\n );\n}\n\nfunction ReasoningPart({ text }: { text: string }): JSX.Element {\n return (\n <ToolMessage className=\"fk:bg-muted/30\">\n <ToolHeader>\n <BrainIcon className=\"fk:size-3.5\" />\n Reasoning\n </ToolHeader>\n <p className=\"fk:mt-2 fk:whitespace-pre-wrap fk:text-xs fk:text-muted-foreground\">{text}</p>\n </ToolMessage>\n );\n}\n\nfunction ToolMessage({ children, className = '' }: { children: React.ReactNode; className?: string }): JSX.Element {\n return (\n <div\n className={`fk:min-w-0 fk:max-w-full fk:overflow-x-auto fk:rounded-xl fk:border fk:border-border fk:bg-background fk:px-3.5 fk:py-3 fk:text-sm ${className}`}\n >\n {children}\n </div>\n );\n}\n\nfunction ToolHeader({ children }: { children: React.ReactNode }): JSX.Element {\n return <div className=\"fk:flex fk:items-center fk:gap-2 fk:font-medium fk:text-muted-foreground\">{children}</div>;\n}\n\nfunction StatusIcon({ isError, loading }: { isError?: boolean; loading?: boolean }): JSX.Element {\n if (loading) {\n return <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />;\n }\n\n if (isError) {\n return <XIcon className=\"fk:size-4 fk:text-red-700\" />;\n }\n\n return <CheckIcon className=\"fk:size-4\" />;\n}\n\nfunction StatusToolPart({\n error,\n icon,\n loading,\n message,\n title,\n}: {\n error?: string;\n icon: React.ReactNode;\n loading: boolean;\n message: string;\n title: string;\n}): JSX.Element {\n return (\n <ToolMessage>\n <ToolHeader>\n {icon}\n {title}\n </ToolHeader>\n <div className=\"fk:relative fk:min-h-5 fk:pl-6\">\n <span className=\"fk:absolute fk:left-0 fk:top-0\">\n <StatusIcon isError={Boolean(error)} loading={loading} />\n </span>\n <span className=\"fk:text-xs\">{message}</span>\n </div>\n </ToolMessage>\n );\n}\n\nfunction GenerateFilesPart({ message }: { message: ReplayDataParts['generating-files'] }): JSX.Element {\n const lastInProgress = ['error', 'uploading', 'generating'].includes(message.status);\n const generated = lastInProgress ? message.paths.slice(0, message.paths.length - 1) : message.paths;\n const generating = lastInProgress ? (message.paths[message.paths.length - 1] ?? '') : null;\n\n return (\n <ToolMessage>\n <ToolHeader>\n <CloudUploadIcon className=\"fk:size-3.5\" />\n <span>{message.status === 'done' ? 'Uploaded files' : 'Generating files'}</span>\n </ToolHeader>\n <div className=\"fk:space-y-1 fk:text-sm\">\n {generated.map((path, index) => (\n <div className=\"fk:flex fk:items-center fk:gap-2\" key={`${path}-${index.toString()}`}>\n <CheckIcon className=\"fk:size-4\" />\n <span className=\"fk:whitespace-pre-wrap\">{path}</span>\n </div>\n ))}\n {typeof generating === 'string' ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <StatusIcon isError={message.status === 'error'} loading={message.status !== 'error'} />\n <span>{message.status === 'error' ? (message.error?.message ?? generating) : generating}</span>\n </div>\n ) : null}\n </div>\n </ToolMessage>\n );\n}\n\nfunction RunArtifactPart({\n api,\n message,\n}: {\n api: ReturnType<typeof createApiClient>;\n message: ReplayDataParts['run-artifact'];\n}): JSX.Element {\n const isDone = message.status === 'done' && message.artifactId;\n const previewUrl = isDone ? api.getArtifactUrl(message.artifactId ?? '') : '';\n const downloadUrl = isDone ? api.getArtifactUrl(message.artifactId ?? '', { download: true }) : '';\n const bytes = formatBytes(message.sizeBytes);\n\n return (\n <ToolMessage>\n <ToolHeader>\n <FileTextIcon className=\"fk:size-3.5\" />\n {message.status === 'done' ? 'Published artifact' : 'Publishing artifact'}\n </ToolHeader>\n <div className=\"fk:relative fk:min-h-5 fk:pl-6\">\n <span className=\"fk:absolute fk:left-0 fk:top-0\">\n <StatusIcon isError={message.status === 'error'} loading={message.status === 'uploading'} />\n </span>\n <div className=\"fk:min-w-0 fk:space-y-2\">\n <div className=\"fk:min-w-0\">\n <div className=\"fk:truncate fk:font-medium\">{message.filename}</div>\n <div className=\"fk:text-xs fk:text-muted-foreground\">\n {message.status === 'uploading' && 'Uploading to artifacts'}\n {message.status === 'done' && [getArtifactLabel(message), bytes].filter(Boolean).join(' · ')}\n {message.status === 'error' && (message.error?.message ?? 'Failed to publish artifact')}\n </div>\n </div>\n {isDone ? (\n <div className=\"fk:flex fk:flex-wrap fk:gap-2\">\n <Button asChild size=\"sm\" variant=\"outline\">\n <a href={previewUrl} rel=\"noreferrer\" target=\"_blank\">\n Preview\n </a>\n </Button>\n <Button asChild size=\"sm\" variant=\"outline\">\n <a href={downloadUrl}>\n <DownloadIcon className=\"fk:size-3\" />\n Download\n </a>\n </Button>\n </div>\n ) : null}\n </div>\n </div>\n </ToolMessage>\n );\n}\n\nfunction ToolDeliveryPart({ message }: { message: ReplayDataParts['tool-delivery'] }): JSX.Element {\n const providerLabel = message.provider === 'slack' ? 'Slack' : 'Microsoft Teams';\n const icon =\n message.provider === 'slack' ? <MessageSquareIcon className=\"fk:size-3.5\" /> : <SendIcon className=\"fk:size-3.5\" />;\n\n return (\n <StatusToolPart\n error={message.error?.message}\n icon={icon}\n loading={message.status === 'loading'}\n message={\n message.status === 'error'\n ? (message.error?.message ?? `Failed to send result to ${message.channelName}`)\n : `${message.status === 'done' ? 'Sent' : 'Sending'} result to ${message.channelName}`\n }\n title={`${providerLabel} Delivery`}\n />\n );\n}\n\nfunction RunSummaryPart({ message }: { message: ReplayDataParts['run-summary'] }): JSX.Element {\n const icon =\n message.status === 'success' ? (\n <CheckCircle2Icon className=\"fk:size-3.5 fk:text-green-700\" />\n ) : message.status === 'skipped' ? (\n <CircleSlashIcon className=\"fk:size-3.5\" />\n ) : (\n <XCircleIcon className=\"fk:size-3.5 fk:text-red-700\" />\n );\n const title =\n message.status === 'success' ? 'Run completed' : message.status === 'skipped' ? 'Run skipped' : 'Run failed';\n\n return (\n <ToolMessage className={message.status === 'failed' ? 'fk:border-red-700/40' : 'fk:border-green-700/40'}>\n <ToolHeader>\n {icon}\n <span>{title}</span>\n </ToolHeader>\n {message.status === 'failed' ? <p className=\"fk:whitespace-pre-wrap fk:text-xs\">{message.summary}</p> : null}\n </ToolMessage>\n );\n}\n\nfunction BulkGraphqlActionPart({ message }: { message: ReplayDataParts['bulk-graphql-action'] }): JSX.Element {\n const progress = [\n typeof message.processedItems === 'number' ? `${message.processedItems.toString()} processed` : '',\n typeof message.changedItems === 'number' ? `${message.changedItems.toString()} changed` : '',\n typeof message.failedItems === 'number' ? `${message.failedItems.toString()} failed` : '',\n typeof message.totalItems === 'number' ? `${message.totalItems.toString()} total` : '',\n ].filter(Boolean);\n\n return (\n <StatusToolPart\n error={message.error?.message}\n icon={<DatabaseZapIcon className=\"fk:size-3.5\" />}\n loading={message.status === 'loading' || message.status === 'running'}\n message={\n message.status === 'error'\n ? (message.error?.message ?? `Failed bulk ${message.operationName}`)\n : `${message.status === 'done' ? 'Completed' : 'Running'} ${message.operationName}${\n progress.length > 0 ? ` (${progress.join(', ')})` : ''\n }`\n }\n title=\"Bulk GraphQL action\"\n />\n );\n}\n\nfunction UnknownDataPart({ part }: { part: ReplayMessagePart }): JSX.Element {\n return (\n <ToolMessage className=\"fk:bg-muted/30\">\n <ToolHeader>\n <CheckCircle2Icon className=\"fk:size-3.5\" />\n {part.type.replace(/^data-/, '').replaceAll('-', ' ')}\n </ToolHeader>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n This run emitted a structured event that is not yet rendered by Studio.\n </p>\n </ToolMessage>\n );\n}\n\nfunction getValidateGraphqlMessage(message: ReplayDataParts['validate-graphql']): string {\n if (message.status === 'error') {\n return message.error?.message ?? 'Failed to validate GraphQL';\n }\n\n if (message.status === 'invalid') {\n const count = message.errorCount ?? 0;\n\n return `Validation failed with ${count.toString()} ${count === 1 ? 'error' : 'errors'}`;\n }\n\n if (message.status === 'valid') {\n return 'GraphQL operation is valid';\n }\n\n return 'Validating GraphQL';\n}\n\nfunction formatBytes(sizeBytes?: number): string {\n if (typeof sizeBytes !== 'number') {\n return '';\n }\n\n if (sizeBytes < 1024) {\n return `${sizeBytes.toString()} B`;\n }\n\n const kilobytes = sizeBytes / 1024;\n\n if (kilobytes < 1024) {\n return `${kilobytes.toFixed(1)} KB`;\n }\n\n return `${(kilobytes / 1024).toFixed(1)} MB`;\n}\n\nfunction getArtifactLabel(message: ReplayDataParts['run-artifact']): string {\n if (message.kind === 'pdf') {\n return 'PDF artifact';\n }\n\n if (message.kind === 'html') {\n return 'HTML artifact';\n }\n\n return 'Artifact';\n}\n","import { Bot as BotIcon } from 'lucide-react';\nimport type { PluginOptions } from '@flexkit/studio';\nimport { Root } from './root';\nimport {\n AutomationDetailPage,\n AutomationsPage,\n CreateAutomationPage,\n RunDetailPage,\n RunHistoryPage,\n RunsPage,\n} from './pages';\n\nexport function Automations(): PluginOptions {\n return {\n name: 'flexkit.automations',\n contributes: {\n apps: [\n {\n component: <Root />,\n icon: <BotIcon strokeWidth={1.5} />,\n name: 'automations',\n routes: [\n {\n component: <AutomationsPage />,\n path: '',\n },\n {\n component: <RunHistoryPage />,\n path: 'runs',\n },\n {\n component: <CreateAutomationPage />,\n path: 'new',\n },\n {\n component: <AutomationDetailPage />,\n path: ':automationId',\n },\n {\n component: <RunsPage />,\n path: ':automationId/runs',\n },\n {\n component: <RunDetailPage />,\n path: ':automationId/runs/:runId',\n },\n ],\n title: 'Automations',\n },\n ],\n },\n };\n}\n\nexport type {\n Automation,\n AutomationArtifact,\n AutomationCreditBalance,\n AutomationInput,\n AutomationRun,\n AutomationRunStatus,\n AutomationToolChannel,\n AutomationToolProvider,\n RunHistory,\n RunHistoryRun,\n} from './types';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sidebar.tsx","../src/root.tsx","../src/api.ts","../src/form.tsx","../src/spec-renderer.tsx","../src/pages.tsx","../src/index.tsx"],"names":["NavLinkCompat","NavLink","AutomationsSidebar","isRunHistory","useLocation","jsxs","SidebarPanel","jsx","SidebarContent","SidebarGroup","SidebarMenu","SidebarMenuItem","SidebarMenuButton","BotIcon","HistoryIcon","SidebarRail","SIDEBAR_COOKIE_NAME","Root","currentProjectId","useConfig","defaultOpen","row","SidebarProvider","SidebarInset","Outlet","getDashboardOrigin","hostname","protocol","getApiRootDomain","getWebhookTriggerUrl","projectId","token","createApiClient","projectBasePath","automationsBasePath","request","url","init","response","data","error","runId","input","automationId","artifactId","options","suffix","teamId","workflowRunId","provider","fetcher","paths","basePath","offset","limit","scope","TOOL_PROVIDERS","TRIGGER_EVENTS","HOURLY_CRON","DEFAULT_DAILY_CRON","DEFAULT_WEEKLY_CRON","DEFAULT_CUSTOM_CRON","DAY_OPTIONS","HOUR_OPTIONS","_","hour","isFormValidationClean","validation","FieldError","id","message","TriangleAlertIcon","createTriggerKey","getInitialTriggers","automation","trigger","getLocalTimezone","generateWebhookSecret","bytes","byte","parseScheduleKind","cron","daily","weekly","getNextRuns","timezone","count","expression","CronExpressionParser","formatRunDate","date","getCronError","trimmed","fieldCount","getModelOptions","models","mode","selectedModelId","activeModels","model","selectedModel","getChannelKey","channel","mergeChannels","selectedChannels","availableChannels","channelsByKey","getInitialProviderToolFormData","providerTools","getInitialToolsFormData","tools","ChannelPicker","channels","disabled","loading","onChange","onRefresh","value","open","setOpen","useState","query","setQuery","containerRef","useRef","selectedIds","providerLabel","filteredChannels","useEffect","handlePointerDown","event","target","handleKeyDown","handleSelect","selectedChannel","handleRemove","channelId","Button","current","Badge","XIcon","ChevronsUpDownIcon","Input","CheckIcon","Fragment","LoaderCircleIcon","RefreshCwIcon","NextRunLabel","nextRun","HourSelect","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","DaySelect","day","CronEditor","nextRuns","ChevronDownIcon","run","ScheduleTriggerRow","kind","WebhookTriggerRow","copiedUrl","setCopiedUrl","copiedSecret","setCopiedSecret","copyToClipboard","text","markCopied","Tooltip","TooltipTrigger","CopyIcon","TooltipContent","KeyRoundIcon","EntityTriggerRow","entities","toggleEvent","events","toggleEntity","entity","selected","entityLabel","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","TriggersField","errors","triggers","hasWebhookTrigger","addTrigger","addScheduleTrigger","updateTrigger","updated","removeTrigger","key","ClockIcon","WebhookIcon","DatabaseZapIcon","Trash2Icon","Separator","PlusIcon","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","SlackIcon","TeamsIcon","AutomationForm","api","onSaved","name","setName","instructions","setInstructions","enabled","setEnabled","modelId","setModelId","setTriggers","isSaving","setIsSaving","setMessage","touched","setTouched","toolsFormData","setToolsFormData","toolsUrl","toolsData","useSWR","entitiesData","modelOptions","useMemo","effectiveModelId","triggerErrors","cronError","toolErrors","tool","isValid","showNameError","showInstructionsError","loadProviderChannels","useCallback","result","loadErrorMessage","updateTool","handleRemoveTool","handleSubmit","toolConfigs","_key","toast","Label","Switch","Textarea","BrainIcon","cardMaxWidthClasses","Card","children","element","props","maxWidthClass","centeredClass","stackGapClasses","stackAlignClasses","stackJustifyClasses","Stack","directionClass","gapClass","alignClass","justifyClass","gridColumnClasses","gridGapClasses","Grid","columnClass","SeparatorPrimitive","headingClasses","Heading","level","textClasses","Text","BadgeComponent","AlertIcon","type","CheckCircle2Icon","AlertTriangleIcon","XCircleIcon","InfoIcon","Alert","typeClass","Table","columns","rows","TablePrimitive","TableCaption","TableHeader","TableRow","column","TableHead","TableBody","rowIndex","cell","cellIndex","TableCell","Progress","max","percent","Skeleton","SkeletonPrimitive","LinkComponent","ExternalLink","Image","Accordion","item","index","Tabs","tabs","TabsPrimitive","TabsList","tab","TabsTrigger","TabContent","TabsContent","trendClasses","TrendIcon","trend","TrendingUpIcon","TrendingDownIcon","MinusIcon","Metric","calloutClasses","CalloutIcon","LightbulbIcon","OctagonAlertIcon","Callout","timelineDotClasses","Timeline","items","CHART_COLORS","chartTooltipStyle","chartTooltipItemStyle","chartTooltipLabelStyle","chartTick","toNumber","parsed","getChartPoints","groups","group","x","ChartFrame","height","title","ResponsiveContainer","BarChart","points","color","RechartsBarChart","CartesianGrid","XAxis","YAxis","RechartsTooltip","Bar","LineChart","RechartsLineChart","Line","PieChart","slices","RechartsPieChart","Pie","slice","Cell","Mermaid","chart","diagramId","useId","svg","setSvg","setError","isCancelled","mermaid","isDark","renderError","registry","fallback","sanitizeSpec","spec","hasChanged","elements","elementKey","elementChildren","childKey","RunSpecPart","parts","builtSpec","buildSpecFromParts","stateKey","StateProvider","VisibilityProvider","ActionProvider","Renderer","useProjectApi","PageMessage","StatusBadge","status","getScheduleSummary","getTriggerSummary","summaries","isAutomationRunnable","CreditButton","creditBalance","CoinsIcon","AutomationsPage","navigate","useNavigate","mutate","automations","a","b","aTime","handleDelete","SidebarTrigger","Link","Plus","formatDistance","Ellipsis","Pencil","DropdownMenuSeparator","Trash2","CreateAutomationPage","ArrowLeft","ScrollArea","AutomationDetailPage","useParams","isRunning","startTransition","useTransition","automationApi","canRunAutomation","selectedAutomationId","handleRunNow","LoaderCircle","Play","RUNS_PAGE_SIZE","RunsPage","getRunsKey","pageIndex","previousPage","runPages","setSize","size","useSWRInfinite","runs","page","hasMore","isLoadingMore","handleLoadMore","currentSize","RunsTable","InfiniteScrollSentinel","onVisible","sentinelRef","onVisibleRef","node","observer","entries","entry","RunHistoryPage","setScope","getHistoryKey","historyPages","metrics","MetricCard","MAX_STREAM_ATTEMPTS","STREAM_RETRY_DELAY_MS","JSON_RENDER_SPEC_PART_TYPE","delay","ms","resolve","isAbortError","hasRenderableParts","part","getMarkerIds","messages","markerIds","splitSessionMessages","chunkIndex","flush","getPartData","useSessionMessages","useRunStream","streamApi","setStatus","abortController","consumeOnce","sawFinish","chunkStream","parseJsonEventStream","uiMessageChunkSchema","controller","messageStream","readUIMessageStream","consume","attempt","loadTimeout","RunDetailPage","automationData","isCancelling","startCancelTransition","runApi","selectedRunId","handleCancel","format","RunReplay","rawMessages","replayMessage","ReplayMessage","isUser","ZapIcon","MessagePart","partIndex","TextPart","ReasoningPart","GenerateFilesPart","RunArtifactPart","ToolDeliveryPart","RunSummaryPart","StatusToolPart","TerminalIcon","SearchIcon","getValidateGraphqlMessage","operationLabel","BulkGraphqlActionPart","nextPart","UnknownDataPart","ToolMessage","ToolHeader","className","StatusIcon","isError","icon","lastInProgress","generated","generating","CloudUploadIcon","path","isDone","previewUrl","downloadUrl","formatBytes","FileTextIcon","getArtifactLabel","DownloadIcon","MessageSquareIcon","SendIcon","CircleSlashIcon","progress","sizeBytes","kilobytes","Automations"],"mappings":"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","file":"index.js","sourcesContent":["import type { JSX } from 'react';\nimport { BotIcon, HistoryIcon } from 'lucide-react';\nimport { NavLink, useLocation } from 'react-router-dom';\nimport {\n SidebarContent,\n SidebarGroup,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarPanel,\n SidebarRail,\n} from '@flexkit/studio/ui';\n\nconst NavLinkCompat = NavLink as unknown as React.ComponentType<{\n children?: React.ReactNode;\n to: string;\n}>;\n\nexport function AutomationsSidebar(): JSX.Element {\n const location = useLocation();\n const isRunHistory = location.pathname.endsWith('/automations/runs');\n\n return (\n <SidebarPanel collapsible=\"icon\" variant=\"inset\">\n <SidebarContent>\n <SidebarGroup>\n <SidebarMenu>\n <SidebarMenuItem>\n <SidebarMenuButton asChild isActive={!isRunHistory} tooltip=\"Automations\">\n <NavLinkCompat to=\".\">\n <BotIcon className=\"fk:h-4 fk:w-4\" strokeWidth={2} />\n <span>Automations</span>\n </NavLinkCompat>\n </SidebarMenuButton>\n </SidebarMenuItem>\n <SidebarMenuItem>\n <SidebarMenuButton asChild isActive={isRunHistory} tooltip=\"Run History\">\n <NavLinkCompat to=\"runs\">\n <HistoryIcon className=\"fk:h-4 fk:w-4\" strokeWidth={2} />\n <span>Run History</span>\n </NavLinkCompat>\n </SidebarMenuButton>\n </SidebarMenuItem>\n </SidebarMenu>\n </SidebarGroup>\n </SidebarContent>\n <SidebarRail />\n </SidebarPanel>\n );\n}\n","import type { JSX } from 'react';\nimport { Outlet, useConfig } from '@flexkit/studio';\nimport {\n Separator,\n SidebarInset,\n SidebarProvider,\n SidebarTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@flexkit/studio/ui';\nimport { AutomationsSidebar } from './sidebar';\n\nconst SIDEBAR_COOKIE_NAME = 'flexkit:sidebar:state';\n\nexport function Root(): JSX.Element {\n const { currentProjectId } = useConfig();\n const defaultOpen =\n document.cookie\n .split('; ')\n .find((row) => row.startsWith(`${SIDEBAR_COOKIE_NAME}=`))\n ?.split('=')[1] !== 'false';\n\n if (!currentProjectId) {\n return (\n <main className=\"fk:flex fk:h-full fk:flex-1 fk:items-center fk:justify-center fk:p-8 fk:text-sm fk:text-muted-foreground\">\n Select a project to manage automations.\n </main>\n );\n }\n\n return (\n <SidebarProvider className=\"fk:h-full\" defaultOpen={defaultOpen}>\n <AutomationsSidebar />\n <SidebarInset>\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:overflow-hidden fk:px-4 fk:pt-3\">\n {/* <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div>\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Automations</h1>\n <p className=\"fk:mt-1 fk:text-sm fk:text-muted-foreground\">\n Agent-powered tasks that run on a schedule or when your data changes.\n </p>\n </div>\n </div> */}\n <div className=\"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col\">\n <Outlet />\n </div>\n </div>\n </SidebarInset>\n </SidebarProvider>\n );\n}\n","import type {\n Automation,\n AutomationArtifact,\n AutomationInput,\n AutomationToolChannel,\n AutomationToolProvider,\n MutationResult,\n} from './types';\n\nexport interface ApiClient {\n cancelRun: (_runId: string) => Promise<MutationResult>;\n createAutomation: (_input: AutomationInput) => Promise<MutationResult & { automation?: Automation }>;\n deleteAutomation: (_automationId: string) => Promise<MutationResult>;\n getArtifactUrl: (_artifactId: string, _options?: { download?: boolean }) => string;\n getIntegrationManageUrl: (_teamId: string) => string;\n getRunArtifacts: (_workflowRunId: string) => Promise<AutomationArtifact[]>;\n getStreamUrl: (_workflowRunId: string) => string;\n listChannels: (_provider: AutomationToolProvider) => Promise<{\n channels: AutomationToolChannel[];\n errorMessage?: string;\n success: boolean;\n }>;\n runAutomation: (_automationId: string) => Promise<MutationResult & { runId?: string }>;\n updateAutomation: (\n _automationId: string,\n _input: AutomationInput\n ) => Promise<MutationResult & { automation?: Automation }>;\n}\n\nfunction getDashboardOrigin(): string {\n if (typeof window === 'undefined') {\n return 'https://flexkit.io';\n }\n\n const { hostname, protocol } = window.location;\n\n if (hostname === 'localhost' || hostname === '127.0.0.1') {\n return 'https://flexkit.test';\n }\n\n if (hostname === 'flexkit.test' || hostname.endsWith('.flexkit.test')) {\n return `${protocol}//flexkit.test`;\n }\n\n return 'https://flexkit.io';\n}\n\nfunction getApiRootDomain(): string {\n if (typeof window === 'undefined') {\n return 'flexkit.io';\n }\n\n const { hostname } = window.location;\n const isDevHost =\n hostname === 'localhost' ||\n hostname === '127.0.0.1' ||\n hostname === 'flexkit.test' ||\n hostname.endsWith('.flexkit.test');\n\n return isDevHost ? 'flexkit.test' : 'flexkit.io';\n}\n\n/** Public URL an external system calls to fire a webhook trigger. */\nexport function getWebhookTriggerUrl(projectId: string, token: string): string {\n return `https://${projectId}.api.${getApiRootDomain()}/automations/webhook/${encodeURIComponent(token)}`;\n}\n\nexport function createApiClient(projectId: string): ApiClient {\n const projectBasePath = `/api/flexkit/${projectId}`;\n const automationsBasePath = `${projectBasePath}/automations`;\n\n async function request<T>(url: string, init?: RequestInit): Promise<T> {\n const response = await fetch(url, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n ...init,\n });\n const data = (await response.json()) as T;\n\n if (!response.ok) {\n const error = data && typeof data === 'object' && 'error' in data ? String(data.error) : 'Request failed';\n\n throw new Error(error);\n }\n\n return data;\n }\n\n return {\n cancelRun: async (runId) =>\n request<MutationResult>(`${automationsBasePath}/runs/${encodeURIComponent(runId)}/cancel`, { method: 'POST' }),\n createAutomation: async (input) =>\n request<MutationResult & { automation?: Automation }>(automationsBasePath, {\n body: JSON.stringify(input),\n method: 'POST',\n }),\n deleteAutomation: async (automationId) =>\n request<MutationResult>(`${automationsBasePath}/${encodeURIComponent(automationId)}`, { method: 'DELETE' }),\n getArtifactUrl: (artifactId, options) => {\n const suffix = options?.download ? '?download=1' : '';\n\n return `${automationsBasePath}/artifacts/${encodeURIComponent(artifactId)}/content${suffix}`;\n },\n getIntegrationManageUrl: (teamId) => `${getDashboardOrigin()}/dashboard/${teamId}/${projectId}/integrations`,\n getRunArtifacts: async (workflowRunId) =>\n request<{ artifacts: AutomationArtifact[] }>(\n `${automationsBasePath}/runs/${encodeURIComponent(workflowRunId)}/artifacts`\n ).then((response) => response.artifacts),\n getStreamUrl: (workflowRunId) => `${automationsBasePath}/runs/${encodeURIComponent(workflowRunId)}/stream`,\n listChannels: async (provider) => {\n const response = await fetch(`${projectBasePath}/integrations/${provider}/channels`, {\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n const data = (await response.json()) as {\n channels?: AutomationToolChannel[];\n error?: string;\n errorMessage?: string;\n success?: boolean;\n };\n\n if (response.ok) {\n return {\n channels: data.channels ?? [],\n errorMessage: data.errorMessage,\n success: data.success ?? true,\n };\n }\n\n if (data.success === false) {\n return {\n channels: data.channels ?? [],\n errorMessage: data.errorMessage ?? `Failed to load ${provider === 'slack' ? 'Slack' : 'Teams'} channels.`,\n success: false,\n };\n }\n\n const error = data.error ? String(data.error) : 'Request failed';\n\n throw new Error(error);\n },\n runAutomation: async (automationId) =>\n request<MutationResult & { runId?: string }>(`${automationsBasePath}/${encodeURIComponent(automationId)}/runs`, {\n method: 'POST',\n }),\n updateAutomation: async (automationId, input) =>\n request<MutationResult & { automation?: Automation }>(\n `${automationsBasePath}/${encodeURIComponent(automationId)}`,\n {\n body: JSON.stringify(input),\n method: 'PATCH',\n }\n ),\n };\n}\n\nexport const fetcher = async <T>(url: string): Promise<T> => {\n const response = await fetch(url, { credentials: 'include' });\n\n if (!response.ok) {\n throw new Error('Request failed');\n }\n\n return (await response.json()) as T;\n};\n\nexport function paths(projectId: string): {\n automation: (_automationId: string) => string;\n automationRuns: (_automationId: string, _offset?: number, _limit?: number) => string;\n automations: string;\n creditBalance: string;\n entities: string;\n run: (_runId: string) => string;\n runHistory: (_scope: 'mine' | 'team', _offset?: number, _limit?: number) => string;\n tools: (_automationId?: string) => string;\n} {\n const basePath = `/api/flexkit/${projectId}/automations`;\n\n return {\n automation: (automationId) => `${basePath}/${encodeURIComponent(automationId)}`,\n automationRuns: (automationId, offset = 0, limit = 25) =>\n `${basePath}/${encodeURIComponent(automationId)}/runs?offset=${offset.toString()}&limit=${limit.toString()}`,\n automations: basePath,\n creditBalance: `${basePath}/credits`,\n entities: `${basePath}/entities`,\n run: (runId) => `${basePath}/runs/${encodeURIComponent(runId)}`,\n runHistory: (scope, offset = 0, limit = 25) =>\n `${basePath}/runs?scope=${scope}&offset=${offset.toString()}&limit=${limit.toString()}`,\n tools: (automationId) =>\n automationId ? `${basePath}/${encodeURIComponent(automationId)}/tools` : `${basePath}/tools`,\n };\n}\n","import type { FormEvent, JSX } from 'react';\nimport { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport useSWR from 'swr';\nimport { CronExpressionParser } from 'cron-parser';\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Separator,\n Switch,\n Textarea,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@flexkit/studio/ui';\nimport {\n BrainIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronsUpDownIcon,\n ClockIcon,\n CopyIcon,\n DatabaseZapIcon,\n KeyRoundIcon,\n LoaderCircleIcon,\n PlusIcon,\n RefreshCwIcon,\n Trash2Icon,\n TriangleAlertIcon,\n WebhookIcon,\n XIcon,\n} from 'lucide-react';\nimport { fetcher, getWebhookTriggerUrl, paths, type ApiClient } from './api';\nimport type {\n Automation,\n AutomationEntityTrigger,\n AutomationInput,\n AutomationScheduleTrigger,\n AutomationTools,\n AutomationToolChannel,\n AutomationToolConfigInput,\n AutomationToolProvider,\n AutomationTrigger,\n AutomationTriggerEvent,\n AutomationProviderTools,\n AutomationWebhookTrigger,\n} from './types';\n\ninterface AutomationFormProps {\n api: ApiClient;\n automation?: Automation;\n mode: 'create' | 'edit';\n onSaved: (_automation?: Automation) => void;\n projectId: string;\n}\n\ninterface ToolsResponse {\n tools: AutomationTools;\n}\n\ninterface AutomationProviderToolFormData extends AutomationProviderTools {\n availableChannels: AutomationToolChannel[];\n channelsLoadError?: string;\n channelsLoaded: boolean;\n loadingChannels: boolean;\n}\n\ntype AutomationToolsFormData = {\n slack: AutomationProviderToolFormData;\n teams: AutomationProviderToolFormData;\n};\n\ninterface ChannelPickerProps {\n channels: AutomationToolChannel[];\n disabled?: boolean;\n loading: boolean;\n onChange: (_channels: AutomationToolChannel[]) => void;\n onRefresh: () => void;\n provider: AutomationToolProvider;\n value: AutomationToolChannel[];\n}\n\nconst TOOL_PROVIDERS: AutomationToolProvider[] = ['slack', 'teams'];\n\nconst TRIGGER_EVENTS: AutomationTriggerEvent[] = ['create', 'update', 'delete'];\n\nconst HOURLY_CRON = '0 * * * *';\nconst DEFAULT_DAILY_CRON = '0 9 * * *';\nconst DEFAULT_WEEKLY_CRON = '0 9 * * 1';\nconst DEFAULT_CUSTOM_CRON = '0 9 1 * *';\n\nconst DAY_OPTIONS = [\n { label: 'Monday', value: 1 },\n { label: 'Tuesday', value: 2 },\n { label: 'Wednesday', value: 3 },\n { label: 'Thursday', value: 4 },\n { label: 'Friday', value: 5 },\n { label: 'Saturday', value: 6 },\n { label: 'Sunday', value: 0 },\n];\n\nconst HOUR_OPTIONS = Array.from({ length: 24 }, (_, hour) => ({\n label: `${hour.toString().padStart(2, '0')}:00`,\n value: hour,\n}));\n\ntype FormTrigger = AutomationTrigger & { key: string };\ntype ScheduleFormTrigger = AutomationScheduleTrigger & { key: string };\ntype WebhookFormTrigger = AutomationWebhookTrigger & { key: string };\ntype EntityFormTrigger = AutomationEntityTrigger & { key: string };\n\ntype ScheduleKind =\n | { kind: 'hourly' }\n | { hour: number; kind: 'daily' }\n | { day: number; hour: number; kind: 'weekly' }\n | { kind: 'custom' };\n\ninterface FormValidation {\n instructions: string;\n model: string;\n name: string;\n toolErrors: { [provider: string]: string };\n triggerErrors: { [triggerKey: string]: string };\n}\n\nfunction isFormValidationClean(validation: FormValidation): boolean {\n return (\n !validation.instructions &&\n !validation.model &&\n !validation.name &&\n Object.keys(validation.toolErrors).length === 0 &&\n Object.keys(validation.triggerErrors).length === 0\n );\n}\n\nfunction FieldError({ id, message }: { id?: string; message: string }): JSX.Element | null {\n if (!message) {\n return null;\n }\n\n return (\n <p className=\"fk:flex fk:items-start fk:text-sm fk:text-warning fk:gap-1\" id={id} role=\"alert\">\n <TriangleAlertIcon className=\"fk:size-4 fk:shrink-0 fk:mt-0.5\" />\n {message}\n </p>\n );\n}\n\nfunction createTriggerKey(): string {\n return crypto.randomUUID();\n}\n\nfunction getInitialTriggers(automation?: Automation): FormTrigger[] {\n return (automation?.triggers ?? []).map((trigger) => ({ ...trigger, key: trigger.id ?? createTriggerKey() }));\n}\n\nfunction getLocalTimezone(): string {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n}\n\nfunction generateWebhookSecret(): string {\n const bytes = crypto.getRandomValues(new Uint8Array(24));\n\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\nfunction parseScheduleKind(cron: string): ScheduleKind {\n if (cron === HOURLY_CRON) {\n return { kind: 'hourly' };\n }\n\n const daily = /^0 (\\d{1,2}) \\* \\* \\*$/.exec(cron);\n\n if (daily) {\n return { hour: Number(daily[1]), kind: 'daily' };\n }\n\n const weekly = /^0 (\\d{1,2}) \\* \\* ([0-6])$/.exec(cron);\n\n if (weekly) {\n return { day: Number(weekly[2]), hour: Number(weekly[1]), kind: 'weekly' };\n }\n\n return { kind: 'custom' };\n}\n\nfunction getNextRuns(cron: string, timezone: string, count: number): Date[] {\n try {\n const expression = CronExpressionParser.parse(cron, { tz: timezone });\n\n return Array.from({ length: count }, () => expression.next().toDate());\n } catch {\n return [];\n }\n}\n\nfunction formatRunDate(date: Date, timezone: string): string {\n return new Intl.DateTimeFormat('en-US', {\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n month: 'short',\n timeZone: timezone,\n weekday: 'short',\n }).format(date);\n}\n\nfunction getCronError(cron: string, timezone: string): string | null {\n const trimmed = cron.trim();\n\n if (!trimmed) {\n return 'Cron expression is required';\n }\n\n const fieldCount = trimmed.split(/\\s+/).length;\n\n if (fieldCount < 5 || fieldCount > 6) {\n return `Expected 5 fields (min hour day month weekday), got ${fieldCount.toString()}`;\n }\n\n try {\n CronExpressionParser.parse(trimmed, { tz: timezone });\n\n return null;\n } catch {\n return 'Invalid cron expression';\n }\n}\n\nfunction getModelOptions(\n models: AutomationTools['models'],\n mode: AutomationFormProps['mode'],\n selectedModelId: string\n): AutomationTools['models'] {\n const activeModels = models.filter((model) => !model.deprecated);\n\n if (mode !== 'edit' || !selectedModelId) {\n return activeModels;\n }\n\n const selectedModel = models.find((model) => model.id === selectedModelId);\n\n if (selectedModel?.deprecated) {\n return [selectedModel, ...activeModels.filter((model) => model.id !== selectedModelId)];\n }\n\n if (!selectedModel && !activeModels.some((model) => model.id === selectedModelId)) {\n return [\n {\n deprecated: true,\n effort: null,\n id: selectedModelId,\n name: selectedModelId,\n },\n ...activeModels,\n ];\n }\n\n return activeModels;\n}\n\nfunction getChannelKey(channel: AutomationToolChannel): string {\n return `${channel.teamId ?? ''}:${channel.id}`;\n}\n\nfunction mergeChannels(\n selectedChannels: AutomationToolChannel[],\n availableChannels: AutomationToolChannel[]\n): AutomationToolChannel[] {\n const channelsByKey: { [key: string]: AutomationToolChannel } = {};\n\n for (const channel of [...selectedChannels, ...availableChannels]) {\n channelsByKey[getChannelKey(channel)] = channel;\n }\n\n return Object.values(channelsByKey);\n}\n\nfunction getInitialProviderToolFormData(\n providerTools: AutomationProviderTools,\n mode: AutomationFormProps['mode']\n): AutomationProviderToolFormData {\n return {\n ...providerTools,\n availableChannels: providerTools.channels,\n channelsLoaded: !providerTools.connected,\n enabled: providerTools.connected && mode === 'edit' && providerTools.enabled,\n loadingChannels: false,\n };\n}\n\nfunction getInitialToolsFormData(tools: AutomationTools, mode: AutomationFormProps['mode']): AutomationToolsFormData {\n return {\n slack: getInitialProviderToolFormData(tools.providers.slack, mode),\n teams: getInitialProviderToolFormData(tools.providers.teams, mode),\n };\n}\n\nfunction ChannelPicker({\n channels,\n disabled,\n loading,\n onChange,\n onRefresh,\n provider,\n value,\n}: ChannelPickerProps): JSX.Element {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const containerRef = useRef<HTMLDivElement | null>(null);\n const selectedIds = new Set(value.map((channel) => channel.id));\n const providerLabel = provider === 'slack' ? 'Slack' : 'Teams';\n const filteredChannels = channels.filter((channel) => channel.name.toLowerCase().includes(query.toLowerCase()));\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function handlePointerDown(event: PointerEvent): void {\n const { target } = event;\n\n if (!(target instanceof Node) || containerRef.current?.contains(target)) {\n return;\n }\n\n setOpen(false);\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') {\n return;\n }\n\n setOpen(false);\n }\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n function handleSelect(channel: AutomationToolChannel): void {\n if (selectedIds.has(channel.id)) {\n onChange(value.filter((selectedChannel) => selectedChannel.id !== channel.id));\n\n return;\n }\n\n onChange([...value, channel]);\n }\n\n function handleRemove(channelId: string): void {\n onChange(value.filter((channel) => channel.id !== channelId));\n }\n\n return (\n <div className=\"fk:relative\" ref={containerRef}>\n <Button\n aria-expanded={open}\n className=\"fk:h-auto fk:min-h-8 fk:w-full fk:max-w-100 fk:justify-between fk:bg-muted/60 fk:px-3 fk:py-1 hover:fk:border-secondary fk:dark:bg-muted/30\"\n disabled={disabled}\n role=\"combobox\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => setOpen((current) => !current)}\n >\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:gap-1\">\n {value.length === 0 ? (\n <span className=\"fk:text-muted-foreground\">\n {loading ? `Loading ${providerLabel} channels...` : `Select ${providerLabel} channels`}\n </span>\n ) : (\n value.map((channel) => (\n <Badge\n className=\"fk:rounded-sm fk:bg-accent fk:text-xs\"\n key={getChannelKey(channel)}\n variant=\"secondary\"\n onClick={(event) => {\n event.stopPropagation();\n handleRemove(channel.id);\n }}\n >\n {channel.name}\n <XIcon className=\"fk:ml-1 fk:size-3 fk:cursor-pointer\" />\n </Badge>\n ))\n )}\n </div>\n <ChevronsUpDownIcon className=\"fk:size-4 fk:shrink-0 fk:opacity-50\" />\n </Button>\n {open ? (\n <div className=\"fk:absolute fk:z-50 fk:mt-1 fk:w-full fk:max-w-100 fk:rounded-md fk:border fk:bg-popover fk:p-0 fk:text-popover-foreground fk:shadow-md\">\n <div className=\"fk:border-b fk:p-2\">\n <Input\n className=\"fk:h-8\"\n placeholder={`Search ${providerLabel} channels...`}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n </div>\n <div className=\"fk:max-h-56 fk:overflow-auto fk:p-1\">\n {filteredChannels.length > 0 ? (\n filteredChannels.map((channel) => (\n <button\n className=\"fk:flex fk:w-full fk:items-center fk:rounded-sm fk:px-2 fk:py-1.5 fk:text-left fk:text-sm hover:fk:bg-accent\"\n key={getChannelKey(channel)}\n type=\"button\"\n onClick={() => handleSelect(channel)}\n >\n <CheckIcon\n className={`fk:mr-2 fk:size-4 ${selectedIds.has(channel.id) ? 'fk:opacity-100' : 'fk:opacity-0'}`}\n />\n {channel.name}\n </button>\n ))\n ) : (\n <div className=\"fk:px-2 fk:py-6 fk:text-center fk:text-sm fk:text-muted-foreground\">\n {loading ? 'Loading channels...' : 'No channels found.'}\n </div>\n )}\n </div>\n <div className=\"fk:border-t fk:border-border fk:p-2\">\n <Button\n className=\"fk:h-8 fk:w-full fk:justify-start fk:text-xs\"\n disabled={loading}\n type=\"button\"\n variant=\"ghost\"\n onClick={onRefresh}\n >\n {loading ? (\n <>\n <LoaderCircleIcon className=\"fk:mr-2 fk:size-3 fk:animate-spin\" />\n Refreshing channels...\n </>\n ) : (\n <>\n <RefreshCwIcon className=\"fk:mr-2 fk:size-3\" />\n Refresh channels\n </>\n )}\n </Button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction NextRunLabel({ cron, timezone }: { cron: string; timezone: string }): JSX.Element | null {\n const [nextRun] = getNextRuns(cron, timezone, 1);\n\n if (!nextRun) {\n return null;\n }\n\n return <span className=\"fk:text-sm fk:text-muted-foreground\">Next run {formatRunDate(nextRun, timezone)}</span>;\n}\n\nfunction HourSelect({ onChange, value }: { onChange: (_hour: number) => void; value: number }): JSX.Element {\n return (\n <Select value={value.toString()} onValueChange={(hour) => onChange(Number(hour))}>\n <SelectTrigger\n aria-label=\"Hour\"\n className=\"fk:h-7 fk:w-fit fk:gap-1 fk:border-transparent fk:bg-background/90 fk:px-2 fk:py-0 fk:text-sm fk:shadow-sm hover:fk:border-border\"\n size=\"sm\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {HOUR_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value.toString()}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nfunction DaySelect({ onChange, value }: { onChange: (_day: number) => void; value: number }): JSX.Element {\n return (\n <Select value={value.toString()} onValueChange={(day) => onChange(Number(day))}>\n <SelectTrigger\n aria-label=\"Day of week\"\n className=\"fk:h-7 fk:w-fit fk:gap-1 fk:border-transparent fk:bg-background/90 fk:px-2 fk:py-0 fk:text-sm fk:shadow-sm hover:fk:border-border\"\n size=\"sm\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {DAY_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value.toString()}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nfunction CronEditor({\n onChange,\n timezone,\n value,\n}: {\n onChange: (_cron: string) => void;\n timezone: string;\n value: string;\n}): JSX.Element {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const error = getCronError(value, timezone);\n const nextRuns = error ? [] : getNextRuns(value, timezone, 3);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function handlePointerDown(event: PointerEvent): void {\n const { target } = event;\n\n if (!(target instanceof Node) || containerRef.current?.contains(target)) {\n return;\n }\n\n setOpen(false);\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') {\n return;\n }\n\n setOpen(false);\n }\n\n document.addEventListener('pointerdown', handlePointerDown);\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [open]);\n\n return (\n <div className=\"fk:relative\" ref={containerRef}>\n <button\n className=\"fk:flex fk:items-center fk:gap-1.5 fk:rounded-md fk:bg-background/90 fk:px-2 fk:py-1 fk:font-mono fk:text-sm fk:shadow-sm hover:fk:bg-accent\"\n type=\"button\"\n onClick={() => setOpen((current) => !current)}\n >\n {value || 'Set cron'}\n <ChevronDownIcon className=\"fk:size-3.5 fk:opacity-50\" />\n </button>\n {open ? (\n <div className=\"fk:absolute fk:z-50 fk:mt-1 fk:w-72 fk:rounded-md fk:border fk:bg-popover fk:p-3 fk:text-popover-foreground fk:shadow-md\">\n <div className=\"fk:mb-2 fk:text-xs fk:text-muted-foreground\">Cron expression ({timezone})</div>\n <Input\n className={`fk:h-8 fk:font-mono ${error ? 'fk:border-destructive focus-visible:fk:ring-destructive' : ''}`}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n />\n {error ? (\n <p className=\"fk:mt-2 fk:text-xs fk:text-destructive\">{error}</p>\n ) : (\n <div className=\"fk:mt-2 fk:space-y-0.5 fk:text-xs fk:text-muted-foreground\">\n <p className=\"fk:mb-1\">5 fields: min hour day month weekday</p>\n {nextRuns.map((run) => (\n <p key={run.toISOString()}>{formatRunDate(run, timezone)}</p>\n ))}\n </div>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ScheduleTriggerRow({\n onChange,\n trigger,\n}: {\n onChange: (_trigger: ScheduleFormTrigger) => void;\n trigger: ScheduleFormTrigger;\n}): JSX.Element {\n const kind = parseScheduleKind(trigger.cron);\n\n if (kind.kind === 'hourly') {\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Every hour</span>\n <NextRunLabel cron={trigger.cron} timezone={trigger.timezone} />\n </div>\n );\n }\n\n if (kind.kind === 'daily') {\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Every day at</span>\n <HourSelect\n value={kind.hour}\n onChange={(hour) => onChange({ ...trigger, cron: `0 ${hour.toString()} * * *` })}\n />\n <span className=\"fk:text-muted-foreground\">{trigger.timezone}</span>\n <NextRunLabel cron={trigger.cron} timezone={trigger.timezone} />\n </div>\n );\n }\n\n if (kind.kind === 'weekly') {\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Every week on</span>\n <DaySelect\n value={kind.day}\n onChange={(day) => onChange({ ...trigger, cron: `0 ${kind.hour.toString()} * * ${day.toString()}` })}\n />\n <span>at</span>\n <HourSelect\n value={kind.hour}\n onChange={(hour) => onChange({ ...trigger, cron: `0 ${hour.toString()} * * ${kind.day.toString()}` })}\n />\n <span className=\"fk:text-muted-foreground\">{trigger.timezone}</span>\n <NextRunLabel cron={trigger.cron} timezone={trigger.timezone} />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Custom schedule</span>\n <CronEditor\n timezone={trigger.timezone}\n value={trigger.cron}\n onChange={(cron) => onChange({ ...trigger, cron })}\n />\n <span className=\"fk:text-muted-foreground\">{trigger.timezone}</span>\n <NextRunLabel cron={trigger.cron} timezone={trigger.timezone} />\n </div>\n );\n}\n\nfunction WebhookTriggerRow({\n onChange,\n projectId,\n trigger,\n}: {\n onChange: (_trigger: WebhookFormTrigger) => void;\n projectId: string;\n trigger: WebhookFormTrigger;\n}): JSX.Element {\n const [copiedUrl, setCopiedUrl] = useState(false);\n const [copiedSecret, setCopiedSecret] = useState(false);\n const url = trigger.url ?? getWebhookTriggerUrl(projectId, trigger.token);\n\n function copyToClipboard(text: string, markCopied: (_copied: boolean) => void): void {\n void navigator.clipboard.writeText(text).then(() => {\n markCopied(true);\n window.setTimeout(() => markCopied(false), 1500);\n });\n }\n\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>Webhook triggered</span>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className=\"fk:flex fk:min-w-0 fk:max-w-60 fk:items-center fk:gap-1.5 fk:rounded-md fk:bg-background/90 fk:px-2 fk:py-1 fk:text-xs fk:shadow-sm hover:fk:bg-accent\"\n type=\"button\"\n onClick={() => copyToClipboard(url, setCopiedUrl)}\n >\n <span className=\"fk:truncate\">{url}</span>\n {copiedUrl ? (\n <CheckIcon className=\"fk:size-3.5 fk:shrink-0\" />\n ) : (\n <CopyIcon className=\"fk:size-3.5 fk:shrink-0 fk:opacity-60\" />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"fk:max-w-96 fk:break-all\">{url}</TooltipContent>\n </Tooltip>\n {trigger.secret ? (\n <Button\n className=\"fk:h-7 fk:px-2.5 fk:text-xs\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => copyToClipboard(`Bearer ${trigger.secret ?? ''}`, setCopiedSecret)}\n >\n {copiedSecret ? <CheckIcon className=\"fk:size-3.5\" /> : <KeyRoundIcon className=\"fk:size-3.5\" />}\n Copy auth header\n </Button>\n ) : (\n <Button\n className=\"fk:h-7 fk:px-2.5 fk:text-xs\"\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => onChange({ ...trigger, secret: generateWebhookSecret() })}\n >\n <KeyRoundIcon className=\"fk:size-3.5\" />\n Generate auth header\n </Button>\n )}\n </div>\n );\n}\n\nfunction EntityTriggerRow({\n entities,\n onChange,\n trigger,\n}: {\n entities: string[];\n onChange: (_trigger: EntityFormTrigger) => void;\n trigger: EntityFormTrigger;\n}): JSX.Element {\n function toggleEvent(event: AutomationTriggerEvent): void {\n const events = trigger.events.includes(event)\n ? trigger.events.filter((current) => current !== event)\n : [...trigger.events, event];\n\n onChange({ ...trigger, events: TRIGGER_EVENTS.filter((current) => events.includes(current)) });\n }\n\n function toggleEntity(entity: string): void {\n const selected = trigger.entities.includes(entity)\n ? trigger.entities.filter((current) => current !== entity)\n : [...trigger.entities, entity];\n\n onChange({ ...trigger, entities: selected });\n }\n\n const entityLabel = trigger.entities.length > 0 ? trigger.entities.join(', ') : 'All entities';\n\n return (\n <div className=\"fk:flex fk:flex-1 fk:flex-wrap fk:items-center fk:gap-2 fk:text-sm\">\n <span>On</span>\n <div className=\"fk:flex fk:items-center fk:gap-1\">\n {TRIGGER_EVENTS.map((event) => (\n <Button\n className=\"fk:h-7 fk:px-2.5 fk:text-xs fk:capitalize\"\n key={event}\n size=\"sm\"\n type=\"button\"\n variant={trigger.events.includes(event) ? 'secondary' : 'ghost'}\n onClick={() => toggleEvent(event)}\n >\n {trigger.events.includes(event) ? <CheckIcon className=\"fk:size-3\" /> : null}\n {event}\n </Button>\n ))}\n </div>\n <span>of</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:h-7 fk:max-w-60 fk:px-2.5 fk:text-xs\" size=\"sm\" type=\"button\" variant=\"outline\">\n <span className=\"fk:truncate\">{entityLabel}</span>\n <ChevronDownIcon className=\"fk:size-3.5 fk:opacity-50\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:max-h-64 fk:w-56 fk:overflow-auto\">\n {entities.length === 0 ? (\n <DropdownMenuItem disabled>No entities found in the project schema</DropdownMenuItem>\n ) : (\n entities.map((entity) => (\n <DropdownMenuCheckboxItem\n checked={trigger.entities.includes(entity)}\n key={entity}\n onCheckedChange={() => toggleEntity(entity)}\n onSelect={(event) => event.preventDefault()}\n >\n {entity}\n </DropdownMenuCheckboxItem>\n ))\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\nfunction TriggersField({\n entities,\n errors,\n onChange,\n projectId,\n triggers,\n}: {\n entities: string[];\n errors: { [triggerKey: string]: string };\n onChange: (_triggers: FormTrigger[]) => void;\n projectId: string;\n triggers: FormTrigger[];\n}): JSX.Element {\n const hasWebhookTrigger = triggers.some((trigger) => trigger.type === 'webhook');\n\n function addTrigger(trigger: FormTrigger): void {\n onChange([...triggers, trigger]);\n }\n\n function addScheduleTrigger(cron: string): void {\n addTrigger({ cron, key: createTriggerKey(), timezone: getLocalTimezone(), type: 'schedule' });\n }\n\n function updateTrigger(updated: FormTrigger): void {\n onChange(triggers.map((trigger) => (trigger.key === updated.key ? updated : trigger)));\n }\n\n function removeTrigger(key: string): void {\n onChange(triggers.filter((trigger) => trigger.key !== key));\n }\n\n return (\n <div className=\"fk:rounded-lg fk:border fk:bg-muted/60 fk:dark:bg-muted/30\">\n {triggers.map((trigger) => (\n <Fragment key={trigger.key}>\n <div className=\"fk:group fk:rounded-md fk:m-1.5 fk:p-1.5 fk:hover:bg-muted\" key={trigger.key}>\n <div className=\"fk:flex fk:items-center fk:gap-3\">\n {trigger.type === 'schedule' ? (\n <ClockIcon className=\"fk:size-4 fk:shrink-0 fk:text-muted-foreground\" />\n ) : null}\n {trigger.type === 'webhook' ? (\n <WebhookIcon className=\"fk:size-4 fk:shrink-0 fk:text-muted-foreground\" />\n ) : null}\n {trigger.type === 'entity' ? (\n <DatabaseZapIcon className=\"fk:size-4 fk:shrink-0 fk:text-muted-foreground\" />\n ) : null}\n {trigger.type === 'schedule' ? <ScheduleTriggerRow trigger={trigger} onChange={updateTrigger} /> : null}\n {trigger.type === 'webhook' ? (\n <WebhookTriggerRow projectId={projectId} trigger={trigger} onChange={updateTrigger} />\n ) : null}\n {trigger.type === 'entity' ? (\n <EntityTriggerRow entities={entities} trigger={trigger} onChange={updateTrigger} />\n ) : null}\n <Button\n aria-label=\"Remove trigger\"\n className=\"fk:opacity-0 fk:group-hover:opacity-100\"\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => removeTrigger(trigger.key)}\n >\n <Trash2Icon className=\"fk:size-4 fk:text-muted-foreground\" />\n </Button>\n </div>\n {errors[trigger.key] ? (\n <div className=\"fk:mt-1 fk:pl-7\">\n <FieldError message={errors[trigger.key]} />\n </div>\n ) : null}\n </div>\n <Separator className=\"fk:h-4\" />\n </Fragment>\n ))}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className=\"fk:flex fk:w-full fk:items-center fk:gap-3 fk:rounded-b-lg fk:px-3 fk:py-3 fk:text-sm fk:text-muted-foreground hover:fk:bg-muted hover:fk:text-foreground\"\n type=\"button\"\n >\n <PlusIcon className=\"fk:size-4\" />\n Add Trigger\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"fk:w-56\">\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <ClockIcon className=\"fk:mr-2 fk:size-4 fk:text-muted-foreground\" />\n Scheduled\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuItem onClick={() => addScheduleTrigger(HOURLY_CRON)}>Hourly</DropdownMenuItem>\n <DropdownMenuItem onClick={() => addScheduleTrigger(DEFAULT_DAILY_CRON)}>Daily</DropdownMenuItem>\n <DropdownMenuItem onClick={() => addScheduleTrigger(DEFAULT_WEEKLY_CRON)}>Weekly</DropdownMenuItem>\n <DropdownMenuItem onClick={() => addScheduleTrigger(DEFAULT_CUSTOM_CRON)}>Custom (cron)</DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n <DropdownMenuItem\n disabled={hasWebhookTrigger}\n onClick={() =>\n addTrigger({ key: createTriggerKey(), secret: null, token: crypto.randomUUID(), type: 'webhook' })\n }\n >\n <WebhookIcon className=\"fk:mr-2 fk:size-4 fk:text-muted-foreground\" />\n Webhook Triggered\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => addTrigger({ entities: [], events: ['create'], key: createTriggerKey(), type: 'entity' })}\n >\n <DatabaseZapIcon className=\"fk:mr-2 fk:size-4 fk:text-muted-foreground\" />\n Entity Events\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\nfunction SlackIcon(): JSX.Element {\n return (\n <svg\n aria-label=\"Slack\"\n className=\"fk:mt-1 fk:size-3.5 fk:text-muted-foreground\"\n fill=\"currentColor\"\n role=\"img\"\n viewBox=\"0 0 127 127\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M27.2 80c0 7.3-5.9 13.2-13.2 13.2C6.7 93.2.8 87.3.8 80c0-7.3 5.9-13.2 13.2-13.2h13.2V80zm6.6 0c0-7.3 5.9-13.2 13.2-13.2 7.3 0 13.2 5.9 13.2 13.2v33c0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V80z\" />\n <path d=\"M47 27c-7.3 0-13.2-5.9-13.2-13.2C33.8 6.5 39.7.6 47 .6c7.3 0 13.2 5.9 13.2 13.2V27H47zm0 6.7c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H13.9C6.6 60.1.7 54.2.7 46.9c0-7.3 5.9-13.2 13.2-13.2H47z\" />\n <path d=\"M99.9 46.9c0-7.3 5.9-13.2 13.2-13.2 7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H99.9V46.9zm-6.6 0c0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V13.8C66.9 6.5 72.8.6 80.1.6c7.3 0 13.2 5.9 13.2 13.2v33.1z\" />\n <path d=\"M80.1 99.8c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V99.8h13.2zm0-6.6c-7.3 0-13.2-5.9-13.2-13.2 0-7.3 5.9-13.2 13.2-13.2h33.1c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H80.1z\" />\n </svg>\n );\n}\n\nfunction TeamsIcon(): JSX.Element {\n return (\n <svg\n aria-label=\"Microsoft Teams\"\n className=\"fk:mt-1 fk:size-3.5 fk:text-muted-foreground\"\n fill=\"currentColor\"\n role=\"img\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M15.5 5A3 3 0 0 1 14 7.599V7.5a2 2 0 0 0-2-2H9.541A3 3 0 1 1 15.5 5Zm6.25 1a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm-3.294 11.732A3.25 3.25 0 0 0 23 14.75v-4.361a.889.889 0 0 0-.889-.889h-3.879c.17.294.268.636.268 1V17c0 .248-.015.492-.044.732ZM8.169 19.5A5 5 0 0 0 17.5 17v-6.5a1 1 0 0 0-1-1H14v8a2 2 0 0 1-2 2H8.169Z\"\n fillRule=\"evenodd\"\n />\n <path\n clipRule=\"evenodd\"\n d=\"M1 17.5v-10a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1Zm6.75-6.75H9.5v-1.5h-5v1.5h1.75v4.75h1.5v-4.75Z\"\n fillRule=\"evenodd\"\n />\n </svg>\n );\n}\n\nexport function AutomationForm({ api, automation, mode, onSaved, projectId }: AutomationFormProps): JSX.Element {\n const [name, setName] = useState(automation?.name ?? '');\n const [instructions, setInstructions] = useState(automation?.instructions ?? '');\n const [enabled, setEnabled] = useState(automation?.enabled ?? false);\n const [modelId, setModelId] = useState(automation?.modelId ?? '');\n const [triggers, setTriggers] = useState<FormTrigger[]>(() => getInitialTriggers(automation));\n const [isSaving, setIsSaving] = useState(false);\n const [message, setMessage] = useState('');\n const [touched, setTouched] = useState({ instructions: false, name: false });\n const [toolsFormData, setToolsFormData] = useState<AutomationToolsFormData | null>(null);\n const toolsUrl = paths(projectId).tools(automation?.id);\n const { data: toolsData } = useSWR<ToolsResponse>(toolsUrl, fetcher);\n const { data: entitiesData } = useSWR<{ entities: string[] }>(paths(projectId).entities, fetcher);\n const modelOptions = useMemo(\n () => getModelOptions(toolsData?.tools.models ?? [], mode, modelId || automation?.modelId || ''),\n [automation?.modelId, mode, modelId, toolsData?.tools.models]\n );\n const effectiveModelId = modelId || modelOptions[0]?.id || '';\n const validation = useMemo<FormValidation>(() => {\n const triggerErrors: { [triggerKey: string]: string } = {};\n\n for (const trigger of triggers) {\n if (trigger.type === 'schedule') {\n const cronError = getCronError(trigger.cron, trigger.timezone);\n\n if (cronError) {\n triggerErrors[trigger.key] = cronError;\n }\n }\n\n if (trigger.type === 'entity' && trigger.events.length === 0) {\n triggerErrors[trigger.key] = 'Select at least one event (create, update or delete)';\n }\n }\n\n const toolErrors: { [provider: string]: string } = {};\n\n for (const provider of TOOL_PROVIDERS) {\n const tool = toolsFormData?.[provider];\n\n if (tool?.enabled && tool.channels.length === 0) {\n toolErrors[provider] =\n `Select at least one ${provider === 'slack' ? 'Slack' : 'Teams'} channel or remove the tool`;\n }\n }\n\n return {\n instructions: instructions.trim() ? '' : 'Instructions are required',\n model: effectiveModelId ? '' : 'Select a model',\n name: name.trim() ? '' : 'Name is required',\n toolErrors,\n triggerErrors,\n };\n }, [effectiveModelId, instructions, name, toolsFormData, triggers]);\n const isValid = isFormValidationClean(validation);\n const showNameError = touched.name && Boolean(validation.name);\n const showInstructionsError = touched.instructions && Boolean(validation.instructions);\n\n useEffect(() => {\n if (!toolsData?.tools) {\n return;\n }\n\n setToolsFormData(getInitialToolsFormData(toolsData.tools, mode));\n }, [automation?.id, mode, toolsData?.tools]);\n\n const loadProviderChannels = useCallback(\n async (provider: AutomationToolProvider): Promise<void> => {\n setToolsFormData((current) => {\n if (!current) {\n return current;\n }\n\n return {\n ...current,\n [provider]: {\n ...current[provider],\n channelsLoadError: undefined,\n loadingChannels: true,\n },\n };\n });\n\n try {\n const result = await api.listChannels(provider);\n const loadErrorMessage = result.success\n ? undefined\n : (result.errorMessage ?? `Failed to load ${provider === 'slack' ? 'Slack' : 'Teams'} channels.`);\n\n setToolsFormData((current) => {\n if (!current) {\n return current;\n }\n\n return {\n ...current,\n [provider]: {\n ...current[provider],\n availableChannels: mergeChannels(current[provider].channels, result.channels),\n channelsLoadError: loadErrorMessage,\n channelsLoaded: true,\n loadingChannels: false,\n },\n };\n });\n } catch (error) {\n const loadErrorMessage = error instanceof Error ? error.message : 'Failed to load integration channels.';\n\n setToolsFormData((current) => {\n if (!current) {\n return current;\n }\n\n return {\n ...current,\n [provider]: {\n ...current[provider],\n channelsLoadError: loadErrorMessage,\n channelsLoaded: true,\n loadingChannels: false,\n },\n };\n });\n }\n },\n [api]\n );\n\n useEffect(() => {\n if (!toolsFormData) {\n return;\n }\n\n for (const provider of TOOL_PROVIDERS) {\n const tool = toolsFormData[provider];\n\n if (tool.connected && !tool.channelsLoaded && !tool.loadingChannels) {\n void loadProviderChannels(provider);\n }\n }\n }, [loadProviderChannels, toolsFormData]);\n\n function updateTool(provider: AutomationToolProvider, value: Partial<AutomationProviderToolFormData>): void {\n setToolsFormData((current) => {\n if (!current) {\n return current;\n }\n\n return {\n ...current,\n [provider]: {\n ...current[provider],\n ...value,\n },\n };\n });\n }\n\n function handleRemoveTool(provider: AutomationToolProvider): void {\n updateTool(provider, {\n channels: [],\n enabled: false,\n });\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>): Promise<void> {\n event.preventDefault();\n\n if (!isValid) {\n setTouched({ instructions: true, name: true });\n\n return;\n }\n\n setIsSaving(true);\n setMessage('');\n\n const toolConfigs: AutomationToolConfigInput[] = TOOL_PROVIDERS.map((provider) => {\n const providerTools = toolsFormData?.[provider] ?? toolsData?.tools.providers[provider];\n\n return {\n channels: providerTools?.channels ?? [],\n enabled: providerTools?.enabled ?? false,\n provider,\n };\n });\n const input: AutomationInput = {\n enabled,\n instructions,\n modelId: effectiveModelId,\n name,\n toolConfigs,\n triggers: triggers.map(({ key: _key, ...trigger }) => trigger),\n };\n\n try {\n const result =\n mode === 'create' || !automation\n ? await api.createAutomation(input)\n : await api.updateAutomation(automation.id, input);\n\n if (!result.success) {\n setMessage(Array.isArray(result.errorMessage) ? result.errorMessage.join(', ') : result.errorMessage);\n\n return;\n }\n\n toast.success(mode === 'create' || !automation ? 'Automation created.' : 'Automation saved.');\n onSaved(result.automation);\n } catch (error) {\n setMessage(error instanceof Error ? error.message : 'Failed to save automation.');\n } finally {\n setIsSaving(false);\n }\n }\n\n return (\n <form className=\"fk:max-w-3xl fk:space-y-8 fk:px-1 fk:mx-auto\" onSubmit={(event) => void handleSubmit(event)}>\n {message ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-3 fk:text-sm fk:text-destructive\">\n {message}\n </div>\n ) : null}\n\n <div className=\"fk:space-y-3\">\n <Label className=\"fk:mb-1\">Status</Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-1\">\n Disabling an automation stops its schedules and ignores webhook calls and entity events\n </p>\n <div className=\"fk:flex fk:h-10 fk:items-center fk:gap-2\">\n <Switch checked={enabled} id=\"automation-enabled\" onCheckedChange={setEnabled} />\n <Label className=\"fk:font-normal\" htmlFor=\"automation-enabled\">\n {enabled ? 'Active' : 'Inactive'}\n </Label>\n </div>\n </div>\n\n <div className=\"fk:space-y-3\">\n <Label className=\"fk:mb-1\" htmlFor=\"automation-name\">\n Name\n </Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-2\">Identifying label for this automation</p>\n <Input\n aria-describedby={showNameError ? 'automation-name-error' : undefined}\n aria-invalid={showNameError}\n className={showNameError ? 'fk:border-destructive focus-visible:fk:ring-destructive' : ''}\n id=\"automation-name\"\n value={name}\n onBlur={() => setTouched((current) => ({ ...current, name: true }))}\n onChange={(event) => setName(event.target.value)}\n />\n {showNameError ? <FieldError id=\"automation-name-error\" message={validation.name} /> : null}\n </div>\n\n <div className=\"fk:space-y-3\">\n <Label className=\"fk:mb-1\">Triggers</Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-2\">\n When this automation should run. Schedules run in your timezone; webhooks run when their URL is called.\n </p>\n <TriggersField\n entities={entitiesData?.entities ?? []}\n errors={validation.triggerErrors}\n projectId={projectId}\n triggers={triggers}\n onChange={setTriggers}\n />\n </div>\n\n <div className=\"fk:space-y-3\">\n <Label className=\"fk:mb-1\" htmlFor=\"automation-instructions\">\n Agent instructions\n </Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-2\">\n Natural-language instructions the agent follows on every run. Be specific about entities, conditions, and the\n expected outcome.\n </p>\n <div>\n <div\n className={`fk:rounded-t-md fk:border-x fk:border-t fk:bg-muted/60 fk:ring-offset-background focus-within:fk:ring-2 focus-within:fk:ring-ring focus-within:fk:ring-offset-2 fk:dark:bg-muted/30 ${showInstructionsError ? 'fk:border-destructive' : 'fk:border-input'}`}\n >\n <Textarea\n aria-describedby={showInstructionsError ? 'automation-instructions-error' : undefined}\n aria-invalid={showInstructionsError}\n className=\"fk:flex fk:min-h-[160px] fk:max-h-[320px] fk:w-full fk:rounded-none fk:border-0 fk:bg-transparent fk:dark:bg-transparent fk:pb-11 fk:shadow-none focus-visible:fk:ring-0 focus-visible:fk:ring-offset-0 fk:mask-[linear-gradient(to_bottom,black_calc(100%-2.75rem),#0009_calc(100%-1.25rem),#0003_calc(100%-0.5rem),transparent)]\"\n id=\"automation-instructions\"\n placeholder=\"Describe what the agent should do on each run, e.g. 'When a new Review is created, translate the text to English, run a sentiment analysis and store the result in the sentiment attribute...'\"\n rows={8}\n value={instructions}\n onBlur={() => setTouched((current) => ({ ...current, instructions: true }))}\n onChange={(event) => setInstructions(event.target.value)}\n />\n </div>\n <div\n className={`fk:rounded-b-md fk:border-x fk:border-b fk:bg-muted/60 fk:dark:bg-muted/30 fk:px-2 fk:py-2 ${showInstructionsError ? 'fk:border-destructive' : 'fk:border-input'}`}\n >\n <Select value={effectiveModelId} onValueChange={setModelId}>\n <SelectTrigger\n aria-label=\"Model\"\n className=\"fk:w-fit fk:border-transparent fk:bg-background/90 fk:px-2.5 fk:py-0 fk:text-xs fk:shadow-sm hover:fk:border-border\"\n size=\"sm\"\n >\n <SelectValue placeholder=\"Select a model\" />\n </SelectTrigger>\n <SelectContent align=\"start\">\n {modelOptions.map((model) => (\n <SelectItem key={model.id} value={model.id}>\n {model.name}\n {model.deprecated ? ' (Legacy)' : ''}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n {showInstructionsError ? (\n <FieldError id=\"automation-instructions-error\" message={validation.instructions} />\n ) : null}\n {toolsData && validation.model ? <FieldError message={validation.model} /> : null}\n </div>\n\n <div className=\"fk:space-y-4\">\n <div>\n <Label className=\"fk:text-sm fk:font-medium\">Tools</Label>\n <p className=\"fk:mb-3 fk:text-xs fk:text-muted-foreground\">\n Configure additional destinations and built-in capabilities for this automation.\n </p>\n </div>\n <div className=\"fk:rounded-lg fk:border fk:bg-muted/60 fk:dark:bg-muted/30\">\n <div className=\"fk:rounded-t-lg\">\n <div className=\"fk:m-1.5 fk:flex fk:items-start fk:justify-between fk:gap-3 fk:rounded-md fk:p-1.5 fk:hover:bg-muted\">\n <div className=\"fk:flex fk:gap-3 fk:pb-0.5\">\n <BrainIcon className=\"fk:mt-1 fk:size-3.5 fk:text-muted-foreground\" />\n <div>\n <div className=\"fk:text-sm fk:font-medium\">Memories</div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Builds memory across runs to make automations smarter over time\n </p>\n </div>\n </div>\n <Badge className=\"fk:mt-1.5 fk:py-0 fk:text-[10px] fk:font-light fk:tracking-wide\" variant=\"secondary\">\n Always on\n </Badge>\n </div>\n </div>\n\n {toolsFormData ? (\n TOOL_PROVIDERS.map((provider) => {\n const tool = toolsFormData[provider];\n const providerLabel = provider === 'slack' ? 'Send to Slack' : 'Send to Microsoft Teams';\n const Icon = provider === 'slack' ? SlackIcon : TeamsIcon;\n\n return (\n <div className=\"fk:m-1.5 fk:space-y-2 fk:rounded-md fk:p-1.5 fk:hover:bg-muted\" key={provider}>\n <div className=\"fk:flex fk:items-center fk:justify-between fk:gap-3\">\n <div className=\"fk:flex fk:gap-3\">\n <Icon />\n <div>\n <div className=\"fk:text-sm fk:font-medium\">{providerLabel}</div>\n {tool.workspaceName ? (\n <p className=\"fk:text-xs fk:text-muted-foreground\">Connected to {tool.workspaceName}</p>\n ) : null}\n </div>\n </div>\n {tool.connected ? (\n tool.enabled ? (\n <Button\n aria-label={`Remove ${provider === 'slack' ? 'Slack' : 'Microsoft Teams'} from automation`}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => handleRemoveTool(provider)}\n >\n <Trash2Icon className=\"fk:size-4 fk:text-muted-foreground\" />\n </Button>\n ) : (\n <Button\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => updateTool(provider, { enabled: true })}\n >\n Add\n </Button>\n )\n ) : (\n <Button\n disabled={!toolsData?.tools.teamId}\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => {\n const teamId = toolsData?.tools.teamId;\n\n if (!teamId) {\n return;\n }\n\n window.open(api.getIntegrationManageUrl(teamId), '_blank', 'noopener,noreferrer');\n }}\n >\n Manage\n </Button>\n )}\n </div>\n {!tool.connected ? (\n <p className=\"fk:pl-7 fk:text-xs fk:text-muted-foreground\">\n Connect {provider === 'slack' ? 'Slack' : 'Microsoft Teams'} in Project Integrations before using\n it in an automation.\n </p>\n ) : null}\n {tool.connected && tool.enabled ? (\n <div className=\"fk:space-y-2 fk:pl-7\">\n <Label className=\"fk:mr-3 fk:text-xs fk:font-medium\">Channels</Label>\n <ChannelPicker\n channels={tool.availableChannels}\n disabled={tool.loadingChannels}\n loading={tool.loadingChannels}\n provider={provider}\n value={tool.channels}\n onChange={(channels) => updateTool(provider, { channels })}\n onRefresh={() => {\n void loadProviderChannels(provider);\n }}\n />\n {tool.channelsLoadError ? (\n <p className=\"fk:flex fk:items-start fk:text-sm fk:text-warning fk:gap-1\">\n <TriangleAlertIcon className=\"fk:size-4 fk:shrink-0 fk:mt-0.5\" />\n {tool.channelsLoadError}\n </p>\n ) : null}\n {!tool.channelsLoadError && validation.toolErrors[provider] ? (\n <FieldError message={validation.toolErrors[provider]} />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n })\n ) : (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:p-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircleIcon className=\"fk:size-4 fk:animate-spin\" />\n Loading tools...\n </div>\n )}\n </div>\n </div>\n\n <div className=\"fk:flex fk:items-center fk:justify-end fk:gap-3\">\n {!isValid ? (\n <span className=\"fk:text-xs fk:text-muted-foreground\">Complete the required fields to save</span>\n ) : null}\n <Button disabled={isSaving || !isValid} type=\"submit\">\n {isSaving ? 'Saving...' : mode === 'create' ? 'Create automation' : 'Update automation'}\n </Button>\n </div>\n </form>\n );\n}\n","import type { JSX } from 'react';\nimport type { ComponentRegistry, ComponentRenderer, Spec } from '@json-render/react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport { ActionProvider, Renderer, StateProvider, VisibilityProvider, buildSpecFromParts } from '@json-render/react';\nimport {\n AlertTriangleIcon,\n CheckCircle2Icon,\n InfoIcon,\n LightbulbIcon,\n MinusIcon,\n OctagonAlertIcon,\n TrendingDownIcon,\n TrendingUpIcon,\n XCircleIcon,\n} from 'lucide-react';\nimport {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Cell,\n Line,\n LineChart as RechartsLineChart,\n Pie,\n PieChart as RechartsPieChart,\n ResponsiveContainer,\n Tooltip as RechartsTooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport {\n Badge,\n ExternalLink,\n Separator as SeparatorPrimitive,\n Skeleton as SkeletonPrimitive,\n Table as TablePrimitive,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs as TabsPrimitive,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@flexkit/studio/ui';\n\n// ---------------------------------------------------------------------------\n// Layout components\n// ---------------------------------------------------------------------------\n\ninterface CardProps {\n centered: boolean | null;\n className: string | null;\n description: string | null;\n maxWidth: 'sm' | 'md' | 'lg' | 'full' | null;\n title: string | null;\n}\n\nconst cardMaxWidthClasses = {\n sm: 'fk:max-w-sm',\n md: 'fk:max-w-md',\n lg: 'fk:max-w-lg',\n full: 'fk:max-w-full',\n};\n\nconst Card: ComponentRenderer<CardProps> = ({ children, element }) => {\n const { props } = element;\n const maxWidthClass = props.maxWidth ? cardMaxWidthClasses[props.maxWidth] : '';\n const centeredClass = props.centered ? 'fk:mx-auto' : '';\n\n return (\n <div\n className={`fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 ${maxWidthClass} ${centeredClass} ${props.className ?? ''}`}\n >\n {props.title && <div className=\"fk:text-sm fk:font-medium\">{props.title}</div>}\n {props.description && <div className=\"fk:mt-0.5 fk:text-xs fk:text-muted-foreground\">{props.description}</div>}\n {(props.title ?? props.description) && children ? <div className=\"fk:mt-3\" /> : null}\n {children}\n </div>\n );\n};\n\ninterface StackProps {\n align: 'start' | 'center' | 'end' | 'stretch' | null;\n className: string | null;\n direction: 'horizontal' | 'vertical' | null;\n gap: 'none' | 'sm' | 'md' | 'lg' | 'xl' | null;\n justify: 'start' | 'center' | 'end' | 'between' | 'around' | null;\n}\n\nconst stackGapClasses = {\n none: 'fk:gap-0',\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst stackAlignClasses = {\n start: 'fk:items-start',\n center: 'fk:items-center',\n end: 'fk:items-end',\n stretch: 'fk:items-stretch',\n};\n\nconst stackJustifyClasses = {\n start: 'fk:justify-start',\n center: 'fk:justify-center',\n end: 'fk:justify-end',\n between: 'fk:justify-between',\n around: 'fk:justify-around',\n};\n\nconst Stack: ComponentRenderer<StackProps> = ({ children, element }) => {\n const { props } = element;\n const directionClass = props.direction === 'horizontal' ? 'fk:flex-row fk:flex-wrap' : 'fk:flex-col';\n const gapClass = stackGapClasses[props.gap ?? 'md'];\n const alignClass = props.align ? stackAlignClasses[props.align] : '';\n const justifyClass = props.justify ? stackJustifyClasses[props.justify] : '';\n\n return (\n <div\n className={`fk:flex fk:w-full ${directionClass} ${gapClass} ${alignClass} ${justifyClass} ${props.className ?? ''}`}\n >\n {children}\n </div>\n );\n};\n\ninterface GridProps {\n className: string | null;\n columns: number | null;\n gap: 'sm' | 'md' | 'lg' | 'xl' | null;\n}\n\nconst gridColumnClasses: { [columns: number]: string } = {\n 1: 'fk:grid-cols-1',\n 2: 'fk:grid-cols-2',\n 3: 'fk:grid-cols-3',\n 4: 'fk:grid-cols-4',\n 5: 'fk:grid-cols-5',\n 6: 'fk:grid-cols-6',\n};\n\nconst gridGapClasses = {\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst Grid: ComponentRenderer<GridProps> = ({ children, element }) => {\n const { props } = element;\n const columnClass = gridColumnClasses[props.columns ?? 1] ?? 'fk:grid-cols-1';\n const gapClass = gridGapClasses[props.gap ?? 'md'];\n\n return <div className={`fk:grid fk:w-full ${columnClass} ${gapClass} ${props.className ?? ''}`}>{children}</div>;\n};\n\nconst Separator: ComponentRenderer<{ orientation: 'horizontal' | 'vertical' | null }> = ({ element }) => (\n <SeparatorPrimitive orientation={element.props.orientation ?? 'horizontal'} />\n);\n\n// ---------------------------------------------------------------------------\n// Typography and content components\n// ---------------------------------------------------------------------------\n\ninterface HeadingProps {\n level: 'h1' | 'h2' | 'h3' | 'h4' | null;\n text: string;\n}\n\nconst headingClasses = {\n h1: 'fk:text-xl fk:font-semibold fk:tracking-tight',\n h2: 'fk:text-lg fk:font-semibold fk:tracking-tight',\n h3: 'fk:text-base fk:font-medium',\n h4: 'fk:text-sm fk:font-medium',\n};\n\nconst Heading: ComponentRenderer<HeadingProps> = ({ element }) => {\n const level = element.props.level ?? 'h2';\n const HeadingTag = level;\n\n return <HeadingTag className={headingClasses[level]}>{element.props.text}</HeadingTag>;\n};\n\ninterface TextProps {\n text: string;\n variant: 'body' | 'muted' | 'caption' | 'lead' | 'code' | null;\n}\n\nconst textClasses = {\n body: 'fk:text-sm',\n muted: 'fk:text-sm fk:text-muted-foreground',\n caption: 'fk:text-xs fk:text-muted-foreground',\n lead: 'fk:text-base',\n code: 'fk:rounded fk:bg-muted fk:px-1 fk:py-0.5 fk:font-mono fk:text-xs',\n};\n\nconst Text: ComponentRenderer<TextProps> = ({ element }) => (\n <p className={textClasses[element.props.variant ?? 'body']}>{element.props.text}</p>\n);\n\ninterface BadgeProps {\n text: string;\n variant: 'default' | 'secondary' | 'destructive' | 'outline' | null;\n}\n\nconst BadgeComponent: ComponentRenderer<BadgeProps> = ({ element }) => (\n <Badge variant={element.props.variant ?? 'default'}>{element.props.text}</Badge>\n);\n\ninterface AlertProps {\n message: string | null;\n title: string;\n type: 'success' | 'info' | 'warning' | 'error' | null;\n}\n\nfunction AlertIcon({ type }: { type: AlertProps['type'] }): JSX.Element {\n switch (type) {\n case 'success':\n return <CheckCircle2Icon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'error':\n return <XCircleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n }\n}\n\nconst Alert: ComponentRenderer<AlertProps> = ({ element }) => {\n const { props } = element;\n const typeClass = props.type === 'error' ? 'fk:border-destructive/50 fk:text-destructive' : 'fk:text-foreground';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:bg-card fk:px-4 fk:py-3 fk:text-sm ${typeClass}`}\n role=\"alert\"\n >\n <AlertIcon type={props.type} />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:font-medium\">{props.title}</div>\n {props.message && <div className=\"fk:text-muted-foreground\">{props.message}</div>}\n </div>\n </div>\n );\n};\n\ninterface TableProps {\n caption: string | null;\n columns: string[];\n rows: string[][];\n}\n\nconst Table: ComponentRenderer<TableProps> = ({ element }) => {\n const columns = element.props.columns ?? [];\n const rows = (element.props.rows ?? []).map((row) => row.map(String));\n\n return (\n <div className=\"fk:w-full fk:overflow-hidden fk:rounded-md fk:border fk:border-border fk:mt-2\">\n <TablePrimitive>\n {element.props.caption && <TableCaption>{element.props.caption}</TableCaption>}\n <TableHeader>\n <TableRow>\n {columns.map((column) => (\n <TableHead key={column}>{column}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <TableCell key={cellIndex}>{cell}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </TablePrimitive>\n </div>\n );\n};\n\ninterface ProgressProps {\n label: string | null;\n max: number | null;\n value: number;\n}\n\nconst Progress: ComponentRenderer<ProgressProps> = ({ element }) => {\n const { props } = element;\n const max = props.max ?? 100;\n const percent = max > 0 ? Math.min(100, Math.max(0, (props.value / max) * 100)) : 0;\n\n return (\n <div className=\"fk:w-full\">\n {props.label && (\n <div className=\"fk:mb-1 fk:flex fk:items-center fk:justify-between fk:text-xs fk:text-muted-foreground\">\n <span>{props.label}</span>\n <span className=\"fk:tabular-nums\">{Math.round(percent)}%</span>\n </div>\n )}\n <div className=\"fk:h-2 fk:w-full fk:overflow-hidden fk:rounded-full fk:bg-secondary\">\n <div className=\"fk:h-full fk:rounded-full fk:bg-primary\" style={{ width: `${percent.toString()}%` }} />\n </div>\n </div>\n );\n};\n\nconst Skeleton: ComponentRenderer<{ height: string | null; rounded: boolean | null; width: string | null }> = ({\n element,\n}) => (\n <SkeletonPrimitive\n className={element.props.rounded ? 'fk:rounded-full' : ''}\n style={{ height: element.props.height ?? '1rem', width: element.props.width ?? '100%' }}\n />\n);\n\nconst LinkComponent: ComponentRenderer<{ href: string; label: string }> = ({ element }) => (\n <ExternalLink href={element.props.href}>{element.props.label}</ExternalLink>\n);\n\nconst Image: ComponentRenderer<{\n alt: string;\n height: number | null;\n src: string | null;\n width: number | null;\n}> = ({ element }) => {\n if (!element.props.src) {\n return null;\n }\n\n return (\n <img\n alt={element.props.alt}\n className=\"fk:max-w-full fk:rounded-md\"\n height={element.props.height ?? undefined}\n src={element.props.src}\n width={element.props.width ?? undefined}\n />\n );\n};\n\ninterface AccordionProps {\n items: { content: string; title: string }[];\n type: 'single' | 'multiple' | null;\n}\n\nconst Accordion: ComponentRenderer<AccordionProps> = ({ element }) => (\n <div className=\"fk:w-full fk:divide-y fk:divide-border fk:rounded-md fk:border fk:border-border\">\n {(element.props.items ?? []).map((item, index) => (\n <details className=\"fk:group fk:px-4 fk:py-3\" key={index}>\n <summary className=\"fk:cursor-pointer fk:list-none fk:text-sm fk:font-medium\">{item.title}</summary>\n <p className=\"fk:mt-2 fk:text-sm fk:text-muted-foreground\">{item.content}</p>\n </details>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\ninterface TabsProps {\n defaultValue: string | null;\n tabs: { label: string; value: string }[];\n value: string | null;\n}\n\nconst Tabs: ComponentRenderer<TabsProps> = ({ children, element }) => {\n const tabs = element.props.tabs ?? [];\n\n return (\n <TabsPrimitive defaultValue={element.props.value ?? element.props.defaultValue ?? tabs[0]?.value}>\n <TabsList>\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {children}\n </TabsPrimitive>\n );\n};\n\nconst TabContent: ComponentRenderer<{ value: string }> = ({ children, element }) => (\n <TabsContent value={element.props.value}>{children}</TabsContent>\n);\n\n// ---------------------------------------------------------------------------\n// Result-focused components (Metric, Callout, Timeline)\n// ---------------------------------------------------------------------------\n\ninterface MetricProps {\n detail: string | null;\n label: string;\n trend: 'up' | 'down' | 'neutral' | null;\n value: string;\n}\n\nconst trendClasses = {\n up: 'fk:text-success',\n down: 'fk:text-destructive',\n neutral: 'fk:text-muted-foreground',\n};\n\nfunction TrendIcon({ trend }: { trend: 'up' | 'down' | 'neutral' }): JSX.Element {\n if (trend === 'up') {\n return <TrendingUpIcon className=\"fk:size-4\" />;\n }\n\n if (trend === 'down') {\n return <TrendingDownIcon className=\"fk:size-4\" />;\n }\n\n return <MinusIcon className=\"fk:size-4\" />;\n}\n\nconst Metric: ComponentRenderer<MetricProps> = ({ element }) => {\n const { props } = element;\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4\">\n <div className=\"fk:text-xs fk:font-medium fk:text-muted-foreground\">{props.label}</div>\n <div className=\"fk:mt-1 fk:flex fk:items-center fk:gap-2\">\n <span className=\"fk:text-2xl fk:font-semibold fk:tabular-nums fk:tracking-tight\">{props.value}</span>\n {props.trend && (\n <span className={trendClasses[props.trend]}>\n <TrendIcon trend={props.trend} />\n </span>\n )}\n </div>\n {props.detail && <div className=\"fk:mt-1 fk:text-xs fk:text-muted-foreground\">{props.detail}</div>}\n </div>\n );\n};\n\ninterface CalloutProps {\n content: string;\n title: string | null;\n type: 'info' | 'tip' | 'warning' | 'important' | null;\n}\n\nconst calloutClasses = {\n info: 'fk:border-blue-500/30 fk:bg-blue-500/5 fk:text-blue-700 fk:dark:text-blue-400',\n tip: 'fk:border-emerald-500/30 fk:bg-emerald-500/5 fk:text-emerald-700 fk:dark:text-emerald-400',\n warning: 'fk:border-amber-500/30 fk:bg-amber-500/5 fk:text-amber-700 fk:dark:text-amber-400',\n important: 'fk:border-red-500/30 fk:bg-red-500/5 fk:text-red-700 fk:dark:text-red-400',\n};\n\nfunction CalloutIcon({ type }: { type: 'info' | 'tip' | 'warning' | 'important' }): JSX.Element {\n switch (type) {\n case 'tip':\n return <LightbulbIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'important':\n return <OctagonAlertIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n }\n}\n\nconst Callout: ComponentRenderer<CalloutProps> = ({ element }) => {\n const { props } = element;\n const type = props.type ?? 'info';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:px-4 fk:py-3 fk:text-sm ${calloutClasses[type]}`}\n >\n <CalloutIcon type={type} />\n <div className=\"fk:min-w-0\">\n {props.title && <div className=\"fk:font-medium\">{props.title}</div>}\n <div className=\"fk:text-foreground\">{props.content}</div>\n </div>\n </div>\n );\n};\n\ninterface TimelineProps {\n items: {\n date: string | null;\n description: string | null;\n status: 'completed' | 'current' | 'upcoming' | null;\n title: string;\n }[];\n}\n\nconst timelineDotClasses = {\n completed: 'fk:border-success fk:bg-success',\n current: 'fk:border-primary fk:bg-primary',\n upcoming: 'fk:border-border fk:bg-background',\n};\n\nconst Timeline: ComponentRenderer<TimelineProps> = ({ element }) => (\n <div className=\"fk:w-full\">\n {(element.props.items ?? []).map((item, index, items) => (\n <div className=\"fk:relative fk:flex fk:gap-3 fk:pb-4 fk:last:pb-0\" key={index}>\n {index < items.length - 1 && (\n <div className=\"fk:absolute fk:left-[5px] fk:top-4 fk:h-full fk:w-px fk:bg-border\" />\n )}\n <div\n className={`fk:mt-1 fk:size-[11px] fk:shrink-0 fk:rounded-full fk:border-2 ${timelineDotClasses[item.status ?? 'upcoming']}`}\n />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:flex fk:flex-wrap fk:items-baseline fk:gap-x-2\">\n <span className=\"fk:text-sm fk:font-medium\">{item.title}</span>\n {item.date && <span className=\"fk:text-xs fk:text-muted-foreground\">{item.date}</span>}\n </div>\n {item.description && <div className=\"fk:text-sm fk:text-muted-foreground\">{item.description}</div>}\n </div>\n </div>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Charts\n// ---------------------------------------------------------------------------\n\nconst CHART_COLORS = ['#6366f1', '#10b981', '#f59e0b', '#ef4444', '#06b6d4'];\n\nconst chartTooltipStyle = {\n background: 'hsl(var(--background))',\n border: '1px solid hsl(var(--border))',\n borderRadius: 6,\n color: 'hsl(var(--foreground))',\n fontSize: 12,\n};\n\nconst chartTooltipItemStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTooltipLabelStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTick = { fill: 'hsl(var(--muted-foreground))', fontSize: 11 };\n\ninterface ChartPoint {\n x: string;\n y: number;\n}\n\ninterface CartesianChartProps {\n aggregate: 'sum' | 'count' | 'avg' | null;\n color: string | null;\n data: { [key: string]: unknown }[];\n height: number | null;\n title: string | null;\n xKey: string;\n yKey: string;\n}\n\nfunction toNumber(value: unknown): number {\n const parsed = typeof value === 'number' ? value : Number(value);\n\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction getChartPoints(props: CartesianChartProps): ChartPoint[] {\n const data = props.data ?? [];\n\n if (!props.aggregate) {\n return data.map((row) => ({ x: String(row[props.xKey] ?? ''), y: toNumber(row[props.yKey]) }));\n }\n\n const groups = new Map<string, { count: number; sum: number }>();\n\n for (const row of data) {\n const key = String(row[props.xKey] ?? '');\n const group = groups.get(key) ?? { count: 0, sum: 0 };\n\n group.count += 1;\n group.sum += toNumber(row[props.yKey]);\n groups.set(key, group);\n }\n\n return Array.from(groups.entries()).map(([x, group]) => {\n if (props.aggregate === 'count') {\n return { x, y: group.count };\n }\n\n if (props.aggregate === 'avg') {\n return { x, y: group.count === 0 ? 0 : group.sum / group.count };\n }\n\n return { x, y: group.sum };\n });\n}\n\nfunction ChartFrame({\n children,\n height,\n title,\n}: {\n children: JSX.Element;\n height: number | null;\n title: string | null;\n}): JSX.Element {\n return (\n <div className=\"fk:w-full\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n <div style={{ height: height ?? 256 }}>\n <ResponsiveContainer height=\"100%\" width=\"100%\">\n {children}\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nconst BarChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsBarChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n cursor={{ fill: 'hsl(var(--muted))' }}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Bar dataKey=\"y\" fill={color} name={element.props.yKey} radius={4} />\n </RechartsBarChart>\n </ChartFrame>\n );\n};\n\nconst LineChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsLineChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Line dataKey=\"y\" dot={false} name={element.props.yKey} stroke={color} strokeWidth={2} type=\"monotone\" />\n </RechartsLineChart>\n </ChartFrame>\n );\n};\n\ninterface PieChartProps {\n data: { [key: string]: unknown }[];\n height: number | null;\n nameKey: string;\n title: string | null;\n valueKey: string;\n}\n\nconst PieChart: ComponentRenderer<PieChartProps> = ({ element }) => {\n const slices = (element.props.data ?? []).map((row) => ({\n name: String(row[element.props.nameKey] ?? ''),\n value: toNumber(row[element.props.valueKey]),\n }));\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsPieChart>\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Pie data={slices} dataKey=\"value\" innerRadius=\"45%\" nameKey=\"name\">\n {slices.map((slice, index) => (\n <Cell fill={CHART_COLORS[index % CHART_COLORS.length]} key={`${slice.name}-${index.toString()}`} />\n ))}\n </Pie>\n </RechartsPieChart>\n </ChartFrame>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Mermaid\n// ---------------------------------------------------------------------------\n\ninterface MermaidProps {\n chart: string;\n title: string | null;\n}\n\nconst Mermaid: ComponentRenderer<MermaidProps> = ({ element }) => {\n const { chart, title } = element.props;\n const diagramId = useId().replace(/[^a-zA-Z0-9]/g, '');\n const [svg, setSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n const render = async (): Promise<void> => {\n try {\n const { default: mermaid } = await import('mermaid');\n const isDark = document.documentElement.classList.contains('dark');\n\n mermaid.initialize({ securityLevel: 'strict', startOnLoad: false, theme: isDark ? 'dark' : 'default' });\n\n const result = await mermaid.render(`fk-mermaid-${diagramId}`, chart);\n\n if (!isCancelled) {\n setSvg(result.svg);\n setError(null);\n }\n } catch (renderError) {\n if (!isCancelled) {\n setError(renderError instanceof Error ? renderError.message : 'Failed to render the diagram.');\n }\n }\n };\n\n void render();\n\n return () => {\n isCancelled = true;\n };\n }, [chart, diagramId]);\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n {error ? (\n <pre className=\"fk:overflow-x-auto fk:whitespace-pre-wrap fk:text-xs fk:text-muted-foreground\">{chart}</pre>\n ) : null}\n {!error && svg ? (\n <div className=\"fk:flex fk:justify-center fk:overflow-x-auto\" dangerouslySetInnerHTML={{ __html: svg }} />\n ) : null}\n {!error && !svg ? <SkeletonPrimitive className=\"fk:h-40 fk:w-full\" /> : null}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Registry and spec rendering\n// ---------------------------------------------------------------------------\n\nconst registry: ComponentRegistry = {\n Accordion,\n Alert,\n Badge: BadgeComponent,\n BarChart,\n Callout,\n Card,\n Grid,\n Heading,\n Image,\n LineChart,\n Link: LinkComponent,\n Mermaid,\n Metric,\n PieChart,\n Progress,\n Separator,\n Skeleton,\n Stack,\n TabContent,\n Table,\n Tabs,\n Text,\n Timeline,\n};\n\nconst fallback: ComponentRenderer = ({ element }) => (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:border-border fk:p-3 fk:text-sm fk:text-muted-foreground\">\n Unsupported component: {element.type}\n </div>\n);\n\nfunction sanitizeSpec(spec: Spec): Spec | null {\n if (!spec.elements[spec.root]) {\n return null;\n }\n\n let hasChanged = false;\n const elements: Spec['elements'] = {};\n\n for (const elementKey of Object.keys(spec.elements)) {\n const element = spec.elements[elementKey];\n\n if (!element) {\n continue;\n }\n\n const elementChildren = element.children ?? [];\n const children = elementChildren.filter((childKey) => Boolean(spec.elements[childKey]));\n\n if (children.length !== elementChildren.length) {\n hasChanged = true;\n }\n\n elements[elementKey] = children.length === elementChildren.length ? element : { ...element, children };\n }\n\n if (!hasChanged) {\n return spec;\n }\n\n return { ...spec, elements };\n}\n\ninterface SpecMessagePart {\n data?: unknown;\n text?: string;\n type: string;\n}\n\nexport function RunSpecPart({ parts }: { parts: SpecMessagePart[] }): JSX.Element | null {\n const spec = useMemo(() => {\n const builtSpec = buildSpecFromParts(parts);\n\n return builtSpec ? sanitizeSpec(builtSpec) : null;\n }, [parts]);\n const stateKey = useMemo(() => JSON.stringify(spec?.state ?? {}), [spec]);\n\n if (!spec) {\n return null;\n }\n\n return (\n <StateProvider initialState={spec.state} key={stateKey}>\n <VisibilityProvider>\n <ActionProvider>\n <Renderer fallback={fallback} registry={registry} spec={spec} />\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\nexport type { SpecMessagePart };\n","import type { JSX } from 'react';\nimport type { TextUIPart, UIMessage, UIMessageChunk } from 'ai';\nimport { useEffect, useMemo, useRef, useState, useTransition } from 'react';\nimport { parseJsonEventStream, readUIMessageStream, uiMessageChunkSchema } from 'ai';\nimport { format, formatDistance } from 'date-fns';\nimport {\n ArrowLeft,\n BotIcon,\n BrainIcon,\n CheckCircle2Icon,\n CheckIcon,\n CircleSlashIcon,\n CloudUploadIcon,\n CoinsIcon,\n DatabaseZapIcon,\n DownloadIcon,\n Ellipsis,\n FileTextIcon,\n LoaderCircle,\n MessageSquareIcon,\n Pencil,\n Play,\n Plus,\n SearchIcon,\n SendIcon,\n TerminalIcon,\n Trash2,\n XCircleIcon,\n XIcon,\n ZapIcon,\n} from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport { useConfig } from '@flexkit/studio';\nimport {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n ExternalLink,\n ScrollArea,\n Separator,\n SidebarTrigger,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsList,\n TabsTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@flexkit/studio/ui';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { createApiClient, fetcher, paths } from './api';\nimport { AutomationForm } from './form';\nimport { RunSpecPart } from './spec-renderer';\nimport type { Automation, AutomationCreditBalance, AutomationRun, RunHistory } from './types';\n\ninterface AutomationsResponse {\n automations: Automation[];\n}\n\ninterface AutomationResponse {\n automation: Automation;\n}\n\ninterface RunsResponse {\n hasMore?: boolean;\n runs: AutomationRun[];\n}\n\ninterface RunResponse {\n run: AutomationRun;\n}\n\ninterface HistoryResponse {\n history: RunHistory;\n}\n\ninterface CreditResponse {\n creditBalance: AutomationCreditBalance;\n}\n\nfunction useProjectApi() {\n const { currentProjectId } = useConfig();\n const api = useMemo(() => (currentProjectId ? createApiClient(currentProjectId) : null), [currentProjectId]);\n\n return { api, projectId: currentProjectId };\n}\n\nfunction PageMessage({ children }: { children: string }): JSX.Element {\n return (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:p-8 fk:text-center fk:text-sm fk:text-muted-foreground\">\n {children}\n </div>\n );\n}\n\nfunction StatusBadge({ status }: { status: string }): JSX.Element {\n return (\n <Badge\n className={`fk:border-none fk:h-[19px] fk:text-[0.6875rem] fk:leading-4.5 fk:tracking-wide ${status === 'success' ? 'fk:bg-success/20 fk:text-success' : 'fk:bg-secondary fk:text-secondary-foreground'}`}\n variant={status === 'success' ? 'default' : 'secondary'}\n >\n {status}\n </Badge>\n );\n}\n\nfunction getScheduleSummary(cron: string): string {\n if (cron === '0 * * * *') {\n return 'Every hour';\n }\n\n const daily = /^0 (\\d{1,2}) \\* \\* \\*$/.exec(cron);\n\n if (daily) {\n return `Every day at ${daily[1].padStart(2, '0')}:00`;\n }\n\n const weekly = /^0 (\\d{1,2}) \\* \\* ([0-6])$/.exec(cron);\n\n if (weekly) {\n const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\n return `Every ${days[Number(weekly[2])] ?? 'week'} at ${weekly[1].padStart(2, '0')}:00`;\n }\n\n return cron;\n}\n\nfunction getTriggerSummary(automation: Automation): string {\n const summaries = automation.triggers.map((trigger) => {\n if (trigger.type === 'schedule') {\n return getScheduleSummary(trigger.cron);\n }\n\n if (trigger.type === 'webhook') {\n return 'Webhook';\n }\n\n const entities = trigger.entities.length > 0 ? trigger.entities.join(', ') : 'all entities';\n\n return `On ${trigger.events.join('/')} of ${entities}`;\n });\n\n if (summaries.length === 0) {\n return 'Manual only';\n }\n\n return summaries.join(' · ');\n}\n\nfunction isAutomationRunnable(automation?: Automation): boolean {\n if (!automation) {\n return false;\n }\n\n return Boolean(automation.name.trim() && automation.instructions.trim() && automation.modelId.trim());\n}\n\nfunction CreditButton({ projectId }: { projectId: string }): JSX.Element | null {\n const { data } = useSWR<CreditResponse>(paths(projectId).creditBalance, fetcher);\n const creditBalance = data?.creditBalance;\n\n if (!creditBalance) {\n return null;\n }\n\n return (\n <Button asChild size=\"sm\" variant=\"secondary\">\n <a href={creditBalance.billingUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n <CoinsIcon className=\"fk:mr-2 fk:size-4\" />\n {creditBalance.display} Credit\n </a>\n </Button>\n );\n}\n\nexport function AutomationsPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const navigate = useNavigate();\n const { data, mutate } = useSWR<AutomationsResponse>(projectId ? paths(projectId).automations : null, fetcher);\n const [message, setMessage] = useState('');\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to view automations.</PageMessage>;\n }\n\n const automations = [...(data?.automations ?? [])].sort((a, b) => {\n const aTime = a.lastRunAt ? new Date(a.lastRunAt).getTime() : 0;\n const bTime = b.lastRunAt ? new Date(b.lastRunAt).getTime() : 0;\n\n return bTime - aTime;\n });\n\n async function handleDelete(automation: Automation): Promise<void> {\n setMessage('');\n\n if (!api) {\n return;\n }\n\n const result = await api.deleteAutomation(automation.id);\n\n if (!result.success) {\n setMessage(Array.isArray(result.errorMessage) ? result.errorMessage.join(', ') : result.errorMessage);\n\n return;\n }\n\n await mutate();\n }\n\n return (\n <div className=\"fk:space-y-6 fk:h-full\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Automations</h1>\n <p className=\"fk:mt-1 fk:text-sm fk:text-muted-foreground\">\n Agent-powered tasks that run on a schedule or when your data changes.\n <ExternalLink href=\"https://flexkit.io/docs/automations\">Learn more</ExternalLink>\n </p>\n </div>\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:justify-end fk:gap-3\">\n <CreditButton projectId={projectId} />\n <Button asChild size=\"sm\">\n <Link to=\"new\">\n <Plus className=\"fk:mr-2 fk:size-4\" />\n New Automation\n </Link>\n </Button>\n </div>\n </div>\n\n {message ? <div className=\"fk:text-sm fk:text-destructive\">{message}</div> : null}\n\n {automations.length === 0 ? (\n <PageMessage>No automations yet.</PageMessage>\n ) : (\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Automation</TableHead>\n <TableHead>Triggers</TableHead>\n <TableHead>Last run</TableHead>\n <TableHead className=\"fk:text-center\">Runs</TableHead>\n <TableHead className=\"fk:text-center\">Status</TableHead>\n <TableHead />\n </TableRow>\n </TableHeader>\n <TableBody>\n {automations.map((automation) => (\n <TableRow className=\"fk:cursor-pointer\" key={automation.id} onClick={() => navigate(automation.id)}>\n <TableCell>\n <div className=\"fk:font-medium\">{automation.name}</div>\n </TableCell>\n <TableCell className=\"fk:text-muted-foreground\">{getTriggerSummary(automation)}</TableCell>\n <TableCell>\n {automation.lastRunAt\n ? formatDistance(new Date(automation.lastRunAt), new Date(), { addSuffix: true })\n : 'Never'}\n </TableCell>\n <TableCell className=\"fk:text-center\">{automation.totalRuns}</TableCell>\n <TableCell className=\"fk:text-center\">\n <Badge\n className={`fk:border-none fk:h-[19px] fk:text-[0.6875rem] fk:leading-4.5 fk:tracking-wide ${automation.enabled ? 'fk:bg-success/20 fk:text-success' : 'fk:bg-secondary fk:text-secondary-foreground'}`}\n variant={automation.enabled ? 'default' : 'secondary'}\n >\n {automation.enabled ? 'Enabled' : 'Disabled'}\n </Badge>\n </TableCell>\n <TableCell className=\"fk:text-right\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={`Actions for ${automation.name}`}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <Ellipsis className=\"fk:size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-40\">\n <DropdownMenuItem\n onClick={(event) => {\n event.stopPropagation();\n navigate(automation.id);\n }}\n >\n <Pencil />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n variant=\"destructive\"\n onClick={(event) => {\n event.stopPropagation();\n void handleDelete(automation);\n }}\n >\n <Trash2 />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n )}\n </div>\n );\n}\n\nexport function CreateAutomationPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const navigate = useNavigate();\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to create automations.</PageMessage>;\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">New Automation</h1>\n </div>\n </div>\n <Button asChild className=\"fk:shrink-0 fk:w-fit\" size=\"sm\" variant=\"ghost\">\n <Link to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Automations\n </Link>\n </Button>\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4\">\n <AutomationForm api={api} mode=\"create\" projectId={projectId} onSaved={() => navigate('..')} />\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nexport function AutomationDetailPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const { automationId } = useParams<{ automationId: string }>();\n const navigate = useNavigate();\n const [isRunning, startTransition] = useTransition();\n const { data, mutate } = useSWR<AutomationResponse>(\n projectId && automationId ? paths(projectId).automation(automationId) : null,\n fetcher\n );\n\n if (!projectId || !api || !automationId) {\n return <PageMessage>Select an automation.</PageMessage>;\n }\n\n if (!data?.automation) {\n return <PageMessage>Loading automation...</PageMessage>;\n }\n\n const automationApi = api;\n const canRunAutomation = isAutomationRunnable(data.automation);\n const selectedAutomationId = automationId;\n\n function handleRunNow(): void {\n if (!canRunAutomation) {\n return;\n }\n\n startTransition(async () => {\n const result = await automationApi.runAutomation(selectedAutomationId);\n\n if (result.success && result.runId) {\n navigate(`runs/${result.runId}`);\n\n return;\n }\n\n await mutate();\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">{data.automation.name}</h1>\n </div>\n </div>\n <div className=\"fk:flex fk:shrink-0 fk:flex-wrap fk:items-center fk:justify-between fk:gap-3\">\n <Button asChild size=\"sm\" variant=\"ghost\">\n <Link to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Automations\n </Link>\n </Button>\n <Tabs value=\"settings\">\n <TabsList>\n <TabsTrigger className=\"text-xs\" value=\"settings\">\n Settings\n </TabsTrigger>\n <TabsTrigger className=\"text-xs\" value=\"runs\">\n <Link to=\"runs\">Runs</Link>\n </TabsTrigger>\n </TabsList>\n </Tabs>\n <Button disabled={isRunning || !canRunAutomation} size=\"sm\" onClick={handleRunNow}>\n {isRunning ? (\n <LoaderCircle className=\"fk:mr-2 fk:size-4 fk:animate-spin\" />\n ) : (\n <Play className=\"fk:mr-2 fk:size-4\" />\n )}\n Run now\n </Button>\n </div>\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4\">\n <AutomationForm\n api={api}\n automation={data.automation}\n mode=\"edit\"\n projectId={projectId}\n onSaved={(automation) => {\n if (automation) {\n void mutate({ automation }, { revalidate: false });\n } else {\n void mutate();\n }\n }}\n />\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nconst RUNS_PAGE_SIZE = 25;\n\nexport function RunsPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const { automationId } = useParams<{ automationId: string }>();\n const navigate = useNavigate();\n const [isRunning, startTransition] = useTransition();\n const { data } = useSWR<AutomationResponse>(\n projectId && automationId ? paths(projectId).automation(automationId) : null,\n fetcher\n );\n const getRunsKey = (pageIndex: number, previousPage: RunsResponse | null): string | null => {\n if (!projectId || !automationId) {\n return null;\n }\n\n if (previousPage && previousPage.hasMore === false) {\n return null;\n }\n\n return paths(projectId).automationRuns(automationId, pageIndex * RUNS_PAGE_SIZE, RUNS_PAGE_SIZE);\n };\n const { data: runPages, mutate, setSize, size } = useSWRInfinite<RunsResponse>(getRunsKey, fetcher);\n\n if (!projectId || !api || !automationId) {\n return <PageMessage>Select an automation to view runs.</PageMessage>;\n }\n\n const automationApi = api;\n const canRunAutomation = isAutomationRunnable(data?.automation);\n const selectedAutomationId = automationId;\n\n function handleRunNow(): void {\n if (!canRunAutomation) {\n return;\n }\n\n startTransition(async () => {\n const result = await automationApi.runAutomation(selectedAutomationId);\n\n if (result.success && result.runId) {\n navigate(result.runId);\n\n return;\n }\n\n await mutate();\n });\n }\n\n const runs = runPages?.flatMap((page) => page.runs) ?? [];\n const lastPage = runPages?.[runPages.length - 1];\n const hasMore = lastPage?.hasMore ?? false;\n const isLoadingMore = runPages !== undefined && size > runPages.length;\n\n function handleLoadMore(): void {\n void setSize((currentSize) => currentSize + 1);\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {data?.automation.name ?? 'Automation'}\n </h1>\n </div>\n </div>\n <div className=\"fk:flex fk:shrink-0 fk:flex-wrap fk:items-center fk:justify-between fk:gap-3\">\n <Button asChild size=\"sm\" variant=\"ghost\">\n <Link to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Automations\n </Link>\n </Button>\n <Tabs value=\"runs\">\n <TabsList>\n <TabsTrigger className=\"text-xs\" value=\"settings\">\n <Link relative=\"path\" to=\"..\">\n Settings\n </Link>\n </TabsTrigger>\n <TabsTrigger className=\"text-xs\" value=\"runs\">\n Runs\n </TabsTrigger>\n </TabsList>\n </Tabs>\n <Button disabled={isRunning || !canRunAutomation} size=\"sm\" onClick={handleRunNow}>\n {isRunning ? (\n <LoaderCircle className=\"fk:mr-2 fk:size-4 fk:animate-spin\" />\n ) : (\n <Play className=\"fk:mr-2 fk:size-4\" />\n )}\n Run now\n </Button>\n </div>\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4\">\n <RunsTable basePath=\".\" runs={runs} />\n {hasMore && !isLoadingMore ? <InfiniteScrollSentinel onVisible={handleLoadMore} /> : null}\n {isLoadingMore ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Loading more runs...</span>\n </div>\n ) : null}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction InfiniteScrollSentinel({ onVisible }: { onVisible: () => void }): JSX.Element {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const onVisibleRef = useRef(onVisible);\n\n onVisibleRef.current = onVisible;\n\n useEffect(() => {\n const node = sentinelRef.current;\n\n if (!node) {\n return;\n }\n\n const observer = new IntersectionObserver((entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n onVisibleRef.current();\n }\n });\n\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n return <div className=\"fk:h-px\" ref={sentinelRef} />;\n}\n\nfunction RunsTable({ basePath, runs }: { basePath: string; runs: AutomationRun[] }): JSX.Element {\n if (runs.length === 0) {\n return <PageMessage>No runs found.</PageMessage>;\n }\n\n return (\n <Table>\n <TableBody>\n {runs.map((run) => (\n <TableRow key={run.id}>\n <TableCell className=\"fk:py-2\">\n <Link className=\"fk:font-medium hover:fk:underline\" to={`${basePath}/${run.id}`}>\n {formatDistance(new Date(run.startedAt), new Date(), { addSuffix: true })}\n </Link>\n </TableCell>\n <TableCell className=\"fk:text-muted-foreground\">{run.triggerType}</TableCell>\n <TableCell>\n <StatusBadge status={run.status} />\n </TableCell>\n <TableCell className=\"fk:max-w-md fk:truncate fk:text-muted-foreground\">{run.summary ?? ''}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nexport function RunHistoryPage(): JSX.Element {\n const { projectId } = useProjectApi();\n const [scope, setScope] = useState<'mine' | 'team'>('team');\n const getHistoryKey = (pageIndex: number, previousPage: HistoryResponse | null): string | null => {\n if (!projectId) {\n return null;\n }\n\n if (previousPage && !previousPage.history.hasMore) {\n return null;\n }\n\n return paths(projectId).runHistory(scope, pageIndex * RUNS_PAGE_SIZE, RUNS_PAGE_SIZE);\n };\n const { data: historyPages, setSize, size } = useSWRInfinite<HistoryResponse>(getHistoryKey, fetcher);\n const metrics = historyPages?.[0]?.history.metrics;\n const runs = historyPages?.flatMap((page) => page.history.runs) ?? [];\n const lastPage = historyPages?.[historyPages.length - 1];\n const hasMore = lastPage?.history.hasMore ?? false;\n const isLoadingMore = historyPages !== undefined && size > historyPages.length;\n\n if (!projectId) {\n return <PageMessage>Select a project to view run history.</PageMessage>;\n }\n\n function handleLoadMore(): void {\n void setSize((currentSize) => currentSize + 1);\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-6\">\n <div className=\"fk:flex fk:shrink-0 fk:gap-2\">\n <Button size=\"sm\" variant={scope === 'team' ? 'default' : 'outline'} onClick={() => setScope('team')}>\n Team\n </Button>\n <Button size=\"sm\" variant={scope === 'mine' ? 'default' : 'outline'} onClick={() => setScope('mine')}>\n Mine\n </Button>\n </div>\n {metrics ? (\n <div className=\"fk:grid fk:shrink-0 fk:gap-3 fk:md:grid-cols-4\">\n <MetricCard title=\"Successful 24h\" value={metrics.successful24h} />\n <MetricCard title=\"Failed 24h\" value={metrics.failed24h} />\n <MetricCard title=\"Successful 7d\" value={metrics.successful7d} />\n <MetricCard title=\"Failed 7d\" value={metrics.failed7d} />\n </div>\n ) : null}\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4\">\n <RunsTable\n basePath=\"..\"\n runs={runs.map((run) => ({\n ...run,\n id: `${run.automationId}/runs/${run.id}`,\n }))}\n />\n {hasMore && !isLoadingMore ? <InfiniteScrollSentinel onVisible={handleLoadMore} /> : null}\n {isLoadingMore ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Loading more runs...</span>\n </div>\n ) : null}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction MetricCard({ title, value }: { title: string; value: number }): JSX.Element {\n return (\n <div className=\"fk:rounded-md fk:bg-muted/60 fk:p-4\">\n <div className=\"fk:text-sm fk:text-muted-foreground\">{title}</div>\n <div className=\"fk:mt-1 fk:text-2xl fk:font-medium\">{value.toLocaleString()}</div>\n </div>\n );\n}\n\ninterface ReplayMetadata {\n model?: string;\n}\n\ninterface ReplayError {\n message: string;\n}\n\ninterface ReplayDataParts {\n [key: string]: unknown;\n 'bulk-graphql-action': {\n changedItems?: number;\n failedItems?: number;\n jobId?: string;\n operationName: string;\n processedItems?: number;\n status: 'loading' | 'running' | 'done' | 'error';\n totalItems?: number;\n error?: ReplayError;\n };\n 'create-sandbox': {\n sandboxId?: string;\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'execute-graphql': {\n operationType?: 'query' | 'mutation';\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'generating-files': {\n paths: string[];\n status: 'generating' | 'uploading' | 'uploaded' | 'done' | 'error';\n error?: ReplayError;\n };\n 'run-artifact': {\n artifactId?: string;\n contentType?: string;\n filename: string;\n kind?: 'html' | 'pdf';\n sizeBytes?: number;\n status: 'uploading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'run-command': {\n args: string[];\n command: string;\n commandId?: string;\n exitCode?: number;\n sandboxId: string;\n status: 'executing' | 'running' | 'waiting' | 'done' | 'error';\n error?: ReplayError;\n };\n 'run-summary': {\n status: 'success' | 'skipped' | 'failed';\n summary: string;\n };\n 'search-schema': {\n query?: string;\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'tool-delivery': {\n channelId: string;\n channelName: string;\n provider: 'slack' | 'teams';\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'update-memory': {\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n 'user-message': {\n parts: ReplayMessagePart[];\n };\n 'validate-graphql': {\n errorCount?: number;\n status: 'loading' | 'valid' | 'invalid' | 'error';\n error?: ReplayError;\n };\n 'web-search': {\n query: string;\n status: 'loading' | 'done' | 'error';\n error?: ReplayError;\n };\n}\n\ninterface ReplayTools {\n [key: string]: {\n input: unknown;\n output: unknown | undefined;\n };\n}\n\ntype ReplayMessage = UIMessage<ReplayMetadata, ReplayDataParts, ReplayTools>;\ntype ReplayMessagePart = ReplayMessage['parts'][number];\ntype RunStreamStatus = 'streaming' | 'finished' | 'error' | 'unavailable';\ntype ConsumeOnceResult = 'finished' | 'incomplete' | 'unavailable';\n\nconst MAX_STREAM_ATTEMPTS = 5;\nconst STREAM_RETRY_DELAY_MS = 2000;\nconst JSON_RENDER_SPEC_PART_TYPE = 'data-spec';\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => window.setTimeout(resolve, ms));\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === 'AbortError' || error.message.toLowerCase().includes('aborted');\n}\n\nfunction hasRenderableParts(parts: ReplayMessagePart[]): boolean {\n return parts.some((part) => part.type !== 'step-start');\n}\n\nfunction getMarkerIds(messages: ReplayMessage[]): Set<string> {\n const markerIds = new Set<string>();\n\n for (const message of messages) {\n for (const part of message.parts) {\n if (part.type === 'data-user-message' && part.id) {\n markerIds.add(part.id);\n }\n }\n }\n\n return markerIds;\n}\n\nfunction splitSessionMessages(messages: ReplayMessage[]): ReplayMessage[] {\n const markerIds = getMarkerIds(messages);\n const result: ReplayMessage[] = [];\n\n for (const message of messages) {\n if (message.role === 'user') {\n if (!markerIds.has(message.id)) {\n result.push(message);\n }\n\n continue;\n }\n\n if (message.role !== 'assistant') {\n result.push(message);\n\n continue;\n }\n\n let parts: ReplayMessagePart[] = [];\n let chunkIndex = 0;\n\n const flush = (): void => {\n if (hasRenderableParts(parts)) {\n result.push({ ...message, id: `${message.id}-${chunkIndex.toString()}`, parts });\n }\n\n chunkIndex++;\n parts = [];\n };\n\n for (const part of message.parts) {\n if (part.type === 'data-user-message') {\n const data = getPartData<ReplayDataParts['user-message']>(part);\n\n flush();\n result.push({\n id: part.id ?? crypto.randomUUID(),\n parts: data.parts,\n role: 'user',\n });\n\n continue;\n }\n\n parts.push(part);\n }\n\n flush();\n }\n\n return result;\n}\n\nfunction useSessionMessages(messages: ReplayMessage[]): ReplayMessage[] {\n return useMemo(() => splitSessionMessages(messages), [messages]);\n}\n\nfunction getPartData<T>(part: ReplayMessagePart): T {\n return (part as { data: T }).data;\n}\n\nfunction useRunStream(\n streamApi: string,\n options?: { recordStatus?: AutomationRun['status'] | null }\n): {\n message: ReplayMessage | undefined;\n status: RunStreamStatus;\n} {\n const [message, setMessage] = useState<ReplayMessage>();\n const [status, setStatus] = useState<RunStreamStatus>('streaming');\n\n useEffect(() => {\n if (!streamApi) {\n setMessage(undefined);\n setStatus('unavailable');\n\n return;\n }\n\n const abortController = new AbortController();\n\n const consumeOnce = async (): Promise<ConsumeOnceResult> => {\n const response = await fetch(`${streamApi}?startIndex=0`, {\n credentials: 'include',\n signal: abortController.signal,\n });\n\n if (response.status === 404) {\n return 'unavailable';\n }\n\n if (!response.ok || !response.body) {\n throw new Error(`Failed to fetch the run stream (status ${response.status.toString()})`);\n }\n\n let sawFinish = false;\n const parsedStream = parseJsonEventStream({ schema: uiMessageChunkSchema, stream: response.body });\n type ParsedChunk = typeof parsedStream extends ReadableStream<infer T> ? T : never;\n\n const chunkStream = parsedStream.pipeThrough(\n new TransformStream<ParsedChunk, UIMessageChunk>({\n transform: (result, controller) => {\n if (!result.success) {\n throw result.error;\n }\n\n if (result.value.type === 'finish') {\n sawFinish = true;\n }\n\n controller.enqueue(result.value);\n },\n })\n );\n\n const messageStream = readUIMessageStream<ReplayMessage>({\n onError: (error) => {\n console.error('Automation run stream chunk error', error);\n },\n stream: chunkStream,\n });\n\n for await (const current of messageStream) {\n if (abortController.signal.aborted) {\n break;\n }\n\n setMessage({ ...current });\n }\n\n return sawFinish ? 'finished' : 'incomplete';\n };\n\n const consume = async (): Promise<void> => {\n for (let attempt = 0; attempt < MAX_STREAM_ATTEMPTS; attempt++) {\n if (attempt > 0) {\n await delay(STREAM_RETRY_DELAY_MS);\n setMessage(undefined);\n }\n\n try {\n const result = await consumeOnce();\n\n if (abortController.signal.aborted) {\n return;\n }\n\n if (result === 'unavailable') {\n setStatus('unavailable');\n\n return;\n }\n\n if (result === 'finished') {\n setStatus('finished');\n\n return;\n }\n } catch (error) {\n if (abortController.signal.aborted || isAbortError(error)) {\n return;\n }\n\n console.error('Automation run stream error', error);\n }\n }\n\n setStatus(options?.recordStatus === 'running' ? 'streaming' : 'error');\n };\n\n const loadTimeout = window.setTimeout(() => {\n void consume();\n }, 0);\n\n return () => {\n window.clearTimeout(loadTimeout);\n abortController.abort('Run replay unmounted');\n };\n }, [options?.recordStatus, streamApi]);\n\n return { message, status };\n}\n\nexport function RunDetailPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const { automationId, runId } = useParams<{ automationId: string; runId: string }>();\n const { data, mutate } = useSWR<RunResponse>(projectId && runId ? paths(projectId).run(runId) : null, fetcher);\n const { data: automationData } = useSWR<AutomationResponse>(\n projectId && automationId ? paths(projectId).automation(automationId) : null,\n fetcher\n );\n const [isCancelling, startCancelTransition] = useTransition();\n\n if (!projectId || !api || !automationId || !runId) {\n return <PageMessage>Select a run.</PageMessage>;\n }\n\n const runApi = api;\n const selectedRunId = runId;\n const run = data?.run;\n\n function handleCancel(): void {\n startCancelTransition(async () => {\n await runApi.cancelRun(selectedRunId);\n await mutate();\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2\">\n <div className=\"fk:mb-4 fk:flex fk:shrink-0 fk:items-start fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:mt-1 fk:h-4\" />\n <div className=\"fk:flex-1\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {automationData?.automation.name ?? 'Automation'}\n </h1>\n </div>\n </div>\n <div className=\"fk:flex fk:shrink-0 fk:flex-wrap fk:items-start fk:justify-between fk:gap-3\">\n <div>\n <Button asChild size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n Runs\n </Link>\n </Button>\n <h2 className=\"fk:mt-4 fk:text-lg fk:font-medium\">\n {run ? `Run from ${format(new Date(run.startedAt), 'PPpp')}` : 'Loading run...'}\n </h2>\n </div>\n {run?.status === 'running' ? (\n <Button disabled={isCancelling} size=\"sm\" variant=\"destructive\" onClick={handleCancel}>\n {isCancelling ? 'Cancelling...' : 'Cancel run'}\n </Button>\n ) : null}\n </div>\n <ScrollArea className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <div className=\"fk:pb-6 fk:pr-4 fk:max-w-5xl fk:mx-auto\">\n {run ? <RunReplay api={api} run={run} /> : <PageMessage>Loading run...</PageMessage>}\n </div>\n </ScrollArea>\n </div>\n );\n}\n\nfunction RunReplay({ api, run }: { api: ReturnType<typeof createApiClient>; run: AutomationRun }): JSX.Element {\n const { workflowRunId } = run;\n const streamApi = workflowRunId ? api.getStreamUrl(workflowRunId) : '';\n const { message, status } = useRunStream(streamApi, { recordStatus: run.status });\n const rawMessages = useMemo(() => (message ? [message] : []), [message]);\n const messages = useSessionMessages(rawMessages);\n\n if (!workflowRunId) {\n return <PageMessage>The run has not started streaming yet.</PageMessage>;\n }\n\n return (\n <div className=\"fk:space-y-4\">\n {run.status === 'failed' && run.error ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-4 fk:text-sm\">\n {run.summary ?? run.error}\n </div>\n ) : null}\n {status === 'unavailable' ? (\n <div className=\"fk:rounded-md fk:border fk:border-amber-500/30 fk:bg-amber-500/5 fk:p-4 fk:text-sm\">\n The workflow replay is no longer available. Generated artifacts may still be available below.\n </div>\n ) : null}\n {status === 'error' && messages.length === 0 ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-4 fk:text-sm\">\n Failed to load the run stream. Try reloading the page.\n </div>\n ) : null}\n {messages.length > 0 ? (\n <div className=\"fk:space-y-5 fk:rounded-md fk:bg-background\">\n {messages.map((replayMessage) => (\n <ReplayMessage key={replayMessage.id} api={api} message={replayMessage} />\n ))}\n {status === 'streaming' ? (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:py-4 fk:font-mono fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>Running...</span>\n </div>\n ) : null}\n </div>\n ) : (\n <div className=\"fk:flex fk:items-center fk:justify-center fk:gap-2 fk:rounded-md fk:border fk:border-dashed fk:p-8 fk:font-mono fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n <span>{status === 'unavailable' ? 'No replay events were recorded.' : 'Loading run replay...'}</span>\n </div>\n )}\n </div>\n );\n}\n\nfunction ReplayMessage({\n api,\n message,\n}: {\n api: ReturnType<typeof createApiClient>;\n message: ReplayMessage;\n}): JSX.Element {\n const isUser = message.role === 'user';\n\n return (\n <div className={isUser ? 'fk:ml-auto fk:w-full fk:max-w-[70%]' : 'fk:w-full fk:min-w-0'}>\n <div className=\"fk:mb-2 fk:flex fk:items-center fk:gap-2 fk:font-mono fk:text-sm fk:font-medium fk:text-primary\">\n {isUser ? (\n <>\n <ZapIcon className=\"fk:ml-auto fk:size-4\" />\n <span>Trigger</span>\n </>\n ) : (\n <>\n <BotIcon className=\"fk:size-4\" />\n <span>Agent{message.metadata?.model ? ` (${message.metadata.model})` : ''}</span>\n </>\n )}\n </div>\n <div className=\"fk:space-y-3 fk:min-w-0\">\n {message.parts.map((part, index) => (\n <MessagePart api={api} key={index} part={part} partIndex={index} parts={message.parts} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction MessagePart({\n api,\n part,\n partIndex,\n parts,\n}: {\n api: ReturnType<typeof createApiClient>;\n part: ReplayMessagePart;\n partIndex: number;\n parts: ReplayMessagePart[];\n}): JSX.Element | null {\n if (part.type === 'step-start') {\n return null;\n }\n\n if (part.type === 'text') {\n return <TextPart part={part} />;\n }\n\n if (part.type === 'reasoning') {\n return <ReasoningPart text={part.text} />;\n }\n\n if (part.type === 'data-generating-files') {\n return <GenerateFilesPart message={getPartData<ReplayDataParts['generating-files']>(part)} />;\n }\n\n if (part.type === 'data-run-artifact') {\n return <RunArtifactPart api={api} message={getPartData<ReplayDataParts['run-artifact']>(part)} />;\n }\n\n if (part.type === 'data-tool-delivery') {\n return <ToolDeliveryPart message={getPartData<ReplayDataParts['tool-delivery']>(part)} />;\n }\n\n if (part.type === 'data-run-summary') {\n return <RunSummaryPart message={getPartData<ReplayDataParts['run-summary']>(part)} />;\n }\n\n if (part.type === 'data-run-command') {\n const data = getPartData<ReplayDataParts['run-command']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<TerminalIcon className=\"fk:size-3.5\" />}\n loading={['executing', 'running', 'waiting'].includes(data.status)}\n message={\n data.status === 'error'\n ? (data.error?.message ?? `Command failed: ${data.command}`)\n : `${data.status === 'done' ? 'Ran' : 'Running'} ${data.command} ${data.args.join(' ')}`\n }\n title=\"Run command\"\n />\n );\n }\n\n if (part.type === 'data-search-schema') {\n const data = getPartData<ReplayDataParts['search-schema']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<SearchIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? 'Failed to search schema')\n : `${data.status === 'done' ? 'Searched' : 'Searching'}${data.query ? ` \"${data.query}\"` : ' schema'}`\n }\n title=\"Search schema\"\n />\n );\n }\n\n if (part.type === 'data-web-search') {\n const data = getPartData<ReplayDataParts['web-search']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<SearchIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? 'Failed to search the web')\n : `${data.status === 'done' ? 'Searched' : 'Searching'} \"${data.query}\"`\n }\n title=\"Web search\"\n />\n );\n }\n\n if (part.type === 'data-validate-graphql') {\n const data = getPartData<ReplayDataParts['validate-graphql']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<DatabaseZapIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={getValidateGraphqlMessage(data)}\n title=\"Validate GraphQL\"\n />\n );\n }\n\n if (part.type === 'data-execute-graphql') {\n const data = getPartData<ReplayDataParts['execute-graphql']>(part);\n const operationLabel = data.operationType === 'mutation' ? 'mutation' : 'query';\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<DatabaseZapIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? `Failed to execute ${operationLabel}`)\n : `${data.status === 'done' ? 'Executed' : 'Executing'} ${operationLabel}`\n }\n title=\"Execute GraphQL\"\n />\n );\n }\n\n if (part.type === 'data-bulk-graphql-action') {\n return <BulkGraphqlActionPart message={getPartData<ReplayDataParts['bulk-graphql-action']>(part)} />;\n }\n\n if (part.type === 'data-update-memory') {\n const data = getPartData<ReplayDataParts['update-memory']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<CheckCircle2Icon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? 'Failed to update memory')\n : data.status === 'done'\n ? 'Updated automation memory'\n : 'Updating automation memory'\n }\n title=\"Update memory\"\n />\n );\n }\n\n if (part.type === 'data-create-sandbox') {\n const data = getPartData<ReplayDataParts['create-sandbox']>(part);\n\n return (\n <StatusToolPart\n error={data.error?.message}\n icon={<TerminalIcon className=\"fk:size-3.5\" />}\n loading={data.status === 'loading'}\n message={\n data.status === 'error'\n ? (data.error?.message ?? 'Failed to create sandbox')\n : data.status === 'done'\n ? 'Created sandbox'\n : 'Creating sandbox'\n }\n title=\"Create sandbox\"\n />\n );\n }\n\n if (part.type === JSON_RENDER_SPEC_PART_TYPE) {\n const nextSpecPart = parts.slice(partIndex + 1).find((nextPart) => nextPart.type === JSON_RENDER_SPEC_PART_TYPE);\n\n if (nextSpecPart) {\n return null;\n }\n\n return <RunSpecPart parts={parts} />;\n }\n\n if (part.type.startsWith('data-')) {\n return <UnknownDataPart part={part} />;\n }\n\n return null;\n}\n\nfunction TextPart({ part }: { part: TextUIPart }): JSX.Element {\n return (\n <div className=\"fk:min-w-0 fk:max-w-full fk:overflow-x-auto fk:whitespace-pre-wrap fk:rounded-xl fk:bg-muted fk:px-4 fk:py-3 fk:text-sm fk:font-light fk:leading-relaxed fk:text-secondary-foreground\">\n {part.text}\n </div>\n );\n}\n\nfunction ReasoningPart({ text }: { text: string }): JSX.Element {\n return (\n <ToolMessage className=\"fk:bg-muted/30\">\n <ToolHeader>\n <BrainIcon className=\"fk:size-3.5\" />\n Reasoning\n </ToolHeader>\n <p className=\"fk:mt-2 fk:whitespace-pre-wrap fk:text-xs fk:text-muted-foreground\">{text}</p>\n </ToolMessage>\n );\n}\n\nfunction ToolMessage({ children, className = '' }: { children: React.ReactNode; className?: string }): JSX.Element {\n return (\n <div\n className={`fk:min-w-0 fk:max-w-full fk:overflow-x-auto fk:rounded-xl fk:border fk:border-border fk:bg-background fk:px-3.5 fk:py-3 fk:text-sm ${className}`}\n >\n {children}\n </div>\n );\n}\n\nfunction ToolHeader({ children }: { children: React.ReactNode }): JSX.Element {\n return <div className=\"fk:flex fk:items-center fk:gap-2 fk:font-medium fk:text-muted-foreground\">{children}</div>;\n}\n\nfunction StatusIcon({ isError, loading }: { isError?: boolean; loading?: boolean }): JSX.Element {\n if (loading) {\n return <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />;\n }\n\n if (isError) {\n return <XIcon className=\"fk:size-4 fk:text-red-700\" />;\n }\n\n return <CheckIcon className=\"fk:size-4\" />;\n}\n\nfunction StatusToolPart({\n error,\n icon,\n loading,\n message,\n title,\n}: {\n error?: string;\n icon: React.ReactNode;\n loading: boolean;\n message: string;\n title: string;\n}): JSX.Element {\n return (\n <ToolMessage>\n <ToolHeader>\n {icon}\n {title}\n </ToolHeader>\n <div className=\"fk:relative fk:min-h-5 fk:pl-6\">\n <span className=\"fk:absolute fk:left-0 fk:top-0\">\n <StatusIcon isError={Boolean(error)} loading={loading} />\n </span>\n <span className=\"fk:text-xs\">{message}</span>\n </div>\n </ToolMessage>\n );\n}\n\nfunction GenerateFilesPart({ message }: { message: ReplayDataParts['generating-files'] }): JSX.Element {\n const lastInProgress = ['error', 'uploading', 'generating'].includes(message.status);\n const generated = lastInProgress ? message.paths.slice(0, message.paths.length - 1) : message.paths;\n const generating = lastInProgress ? (message.paths[message.paths.length - 1] ?? '') : null;\n\n return (\n <ToolMessage>\n <ToolHeader>\n <CloudUploadIcon className=\"fk:size-3.5\" />\n <span>{message.status === 'done' ? 'Uploaded files' : 'Generating files'}</span>\n </ToolHeader>\n <div className=\"fk:space-y-1 fk:text-sm\">\n {generated.map((path, index) => (\n <div className=\"fk:flex fk:items-center fk:gap-2\" key={`${path}-${index.toString()}`}>\n <CheckIcon className=\"fk:size-4\" />\n <span className=\"fk:whitespace-pre-wrap\">{path}</span>\n </div>\n ))}\n {typeof generating === 'string' ? (\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <StatusIcon isError={message.status === 'error'} loading={message.status !== 'error'} />\n <span>{message.status === 'error' ? (message.error?.message ?? generating) : generating}</span>\n </div>\n ) : null}\n </div>\n </ToolMessage>\n );\n}\n\nfunction RunArtifactPart({\n api,\n message,\n}: {\n api: ReturnType<typeof createApiClient>;\n message: ReplayDataParts['run-artifact'];\n}): JSX.Element {\n const isDone = message.status === 'done' && message.artifactId;\n const previewUrl = isDone ? api.getArtifactUrl(message.artifactId ?? '') : '';\n const downloadUrl = isDone ? api.getArtifactUrl(message.artifactId ?? '', { download: true }) : '';\n const bytes = formatBytes(message.sizeBytes);\n\n return (\n <ToolMessage>\n <ToolHeader>\n <FileTextIcon className=\"fk:size-3.5\" />\n {message.status === 'done' ? 'Published artifact' : 'Publishing artifact'}\n </ToolHeader>\n <div className=\"fk:relative fk:min-h-5 fk:pl-6\">\n <span className=\"fk:absolute fk:left-0 fk:top-0\">\n <StatusIcon isError={message.status === 'error'} loading={message.status === 'uploading'} />\n </span>\n <div className=\"fk:min-w-0 fk:space-y-2\">\n <div className=\"fk:min-w-0\">\n <div className=\"fk:truncate fk:font-medium\">{message.filename}</div>\n <div className=\"fk:text-xs fk:text-muted-foreground\">\n {message.status === 'uploading' && 'Uploading to artifacts'}\n {message.status === 'done' && [getArtifactLabel(message), bytes].filter(Boolean).join(' · ')}\n {message.status === 'error' && (message.error?.message ?? 'Failed to publish artifact')}\n </div>\n </div>\n {isDone ? (\n <div className=\"fk:flex fk:flex-wrap fk:gap-2\">\n <Button asChild size=\"sm\" variant=\"outline\">\n <a href={previewUrl} rel=\"noreferrer\" target=\"_blank\">\n Preview\n </a>\n </Button>\n <Button asChild size=\"sm\" variant=\"outline\">\n <a href={downloadUrl}>\n <DownloadIcon className=\"fk:size-3\" />\n Download\n </a>\n </Button>\n </div>\n ) : null}\n </div>\n </div>\n </ToolMessage>\n );\n}\n\nfunction ToolDeliveryPart({ message }: { message: ReplayDataParts['tool-delivery'] }): JSX.Element {\n const providerLabel = message.provider === 'slack' ? 'Slack' : 'Microsoft Teams';\n const icon =\n message.provider === 'slack' ? <MessageSquareIcon className=\"fk:size-3.5\" /> : <SendIcon className=\"fk:size-3.5\" />;\n\n return (\n <StatusToolPart\n error={message.error?.message}\n icon={icon}\n loading={message.status === 'loading'}\n message={\n message.status === 'error'\n ? (message.error?.message ?? `Failed to send result to ${message.channelName}`)\n : `${message.status === 'done' ? 'Sent' : 'Sending'} result to ${message.channelName}`\n }\n title={`${providerLabel} Delivery`}\n />\n );\n}\n\nfunction RunSummaryPart({ message }: { message: ReplayDataParts['run-summary'] }): JSX.Element {\n const icon =\n message.status === 'success' ? (\n <CheckCircle2Icon className=\"fk:size-3.5 fk:text-green-700\" />\n ) : message.status === 'skipped' ? (\n <CircleSlashIcon className=\"fk:size-3.5\" />\n ) : (\n <XCircleIcon className=\"fk:size-3.5 fk:text-red-700\" />\n );\n const title =\n message.status === 'success' ? 'Run completed' : message.status === 'skipped' ? 'Run skipped' : 'Run failed';\n\n return (\n <ToolMessage className={message.status === 'failed' ? 'fk:border-red-700/40' : 'fk:border-green-700/40'}>\n <ToolHeader>\n {icon}\n <span>{title}</span>\n </ToolHeader>\n {message.status === 'failed' ? <p className=\"fk:whitespace-pre-wrap fk:text-xs\">{message.summary}</p> : null}\n </ToolMessage>\n );\n}\n\nfunction BulkGraphqlActionPart({ message }: { message: ReplayDataParts['bulk-graphql-action'] }): JSX.Element {\n const progress = [\n typeof message.processedItems === 'number' ? `${message.processedItems.toString()} processed` : '',\n typeof message.changedItems === 'number' ? `${message.changedItems.toString()} changed` : '',\n typeof message.failedItems === 'number' ? `${message.failedItems.toString()} failed` : '',\n typeof message.totalItems === 'number' ? `${message.totalItems.toString()} total` : '',\n ].filter(Boolean);\n\n return (\n <StatusToolPart\n error={message.error?.message}\n icon={<DatabaseZapIcon className=\"fk:size-3.5\" />}\n loading={message.status === 'loading' || message.status === 'running'}\n message={\n message.status === 'error'\n ? (message.error?.message ?? `Failed bulk ${message.operationName}`)\n : `${message.status === 'done' ? 'Completed' : 'Running'} ${message.operationName}${\n progress.length > 0 ? ` (${progress.join(', ')})` : ''\n }`\n }\n title=\"Bulk GraphQL action\"\n />\n );\n}\n\nfunction UnknownDataPart({ part }: { part: ReplayMessagePart }): JSX.Element {\n return (\n <ToolMessage className=\"fk:bg-muted/30\">\n <ToolHeader>\n <CheckCircle2Icon className=\"fk:size-3.5\" />\n {part.type.replace(/^data-/, '').replaceAll('-', ' ')}\n </ToolHeader>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n This run emitted a structured event that is not yet rendered by Studio.\n </p>\n </ToolMessage>\n );\n}\n\nfunction getValidateGraphqlMessage(message: ReplayDataParts['validate-graphql']): string {\n if (message.status === 'error') {\n return message.error?.message ?? 'Failed to validate GraphQL';\n }\n\n if (message.status === 'invalid') {\n const count = message.errorCount ?? 0;\n\n return `Validation failed with ${count.toString()} ${count === 1 ? 'error' : 'errors'}`;\n }\n\n if (message.status === 'valid') {\n return 'GraphQL operation is valid';\n }\n\n return 'Validating GraphQL';\n}\n\nfunction formatBytes(sizeBytes?: number): string {\n if (typeof sizeBytes !== 'number') {\n return '';\n }\n\n if (sizeBytes < 1024) {\n return `${sizeBytes.toString()} B`;\n }\n\n const kilobytes = sizeBytes / 1024;\n\n if (kilobytes < 1024) {\n return `${kilobytes.toFixed(1)} KB`;\n }\n\n return `${(kilobytes / 1024).toFixed(1)} MB`;\n}\n\nfunction getArtifactLabel(message: ReplayDataParts['run-artifact']): string {\n if (message.kind === 'pdf') {\n return 'PDF artifact';\n }\n\n if (message.kind === 'html') {\n return 'HTML artifact';\n }\n\n return 'Artifact';\n}\n","import { Bot as BotIcon } from 'lucide-react';\nimport type { PluginOptions } from '@flexkit/studio';\nimport { Root } from './root';\nimport {\n AutomationDetailPage,\n AutomationsPage,\n CreateAutomationPage,\n RunDetailPage,\n RunHistoryPage,\n RunsPage,\n} from './pages';\n\nexport function Automations(): PluginOptions {\n return {\n name: 'flexkit.automations',\n contributes: {\n apps: [\n {\n component: <Root />,\n icon: <BotIcon strokeWidth={1.5} />,\n name: 'automations',\n routes: [\n {\n component: <AutomationsPage />,\n path: '',\n },\n {\n component: <RunHistoryPage />,\n path: 'runs',\n },\n {\n component: <CreateAutomationPage />,\n path: 'new',\n },\n {\n component: <AutomationDetailPage />,\n path: ':automationId',\n },\n {\n component: <RunsPage />,\n path: ':automationId/runs',\n },\n {\n component: <RunDetailPage />,\n path: ':automationId/runs/:runId',\n },\n ],\n title: 'Automations',\n },\n ],\n },\n };\n}\n\nexport type {\n Automation,\n AutomationArtifact,\n AutomationCreditBalance,\n AutomationInput,\n AutomationRun,\n AutomationRunStatus,\n AutomationToolChannel,\n AutomationToolProvider,\n RunHistory,\n RunHistoryRun,\n} from './types';\n"]}
|