@flexkit/studio 0.1.0 → 0.2.0
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/astro.js +1 -1
- package/dist/chat-page-ZFPMTRLD.js +2 -0
- package/dist/chat-page-ZFPMTRLD.js.map +1 -0
- package/dist/chunk-BKJ2DBRK.js +2 -0
- package/dist/{chunk-QQUNCDUB.js.map → chunk-BKJ2DBRK.js.map} +1 -1
- package/dist/chunk-DPCMOWK4.js +3 -0
- package/dist/chunk-DPCMOWK4.js.map +1 -0
- package/dist/chunk-DQ6Z333C.js +4 -0
- package/dist/{chunk-YINI2YKQ.js.map → chunk-DQ6Z333C.js.map} +1 -1
- package/dist/{chunk-OUSEULBR.js → chunk-LMVJWCOM.js} +4 -4
- package/dist/{chunk-OUSEULBR.js.map → chunk-LMVJWCOM.js.map} +1 -1
- package/dist/{chunk-7PDYCDX6.js → chunk-LX7Q56OS.js} +2 -2
- package/dist/{chunk-7PDYCDX6.js.map → chunk-LX7Q56OS.js.map} +1 -1
- package/dist/chunk-MKEIZ5ZQ.js +5 -0
- package/dist/chunk-MKEIZ5ZQ.js.map +1 -0
- package/dist/chunk-QJWY4XIM.js +2 -0
- package/dist/{chunk-GZIMMYLK.js.map → chunk-QJWY4XIM.js.map} +1 -1
- package/dist/{chunk-C2BPRGGQ.js → chunk-TXK4OFAG.js} +25 -18
- package/dist/{chunk-3CPWATOI.js → chunk-WBZKCRQK.js} +2 -2
- package/dist/{chunk-3CPWATOI.js.map → chunk-WBZKCRQK.js.map} +1 -1
- package/dist/index.css +6 -0
- package/dist/index.js +4 -4
- package/dist/list-GALFFS5F.js +2 -0
- package/dist/{list-SQCN7HA3.js.map → list-GALFFS5F.js.map} +1 -1
- package/dist/nextjs.js +1 -1
- package/dist/pages-IA7GOMMS.js +3 -0
- package/dist/pages-IA7GOMMS.js.map +1 -0
- package/dist/{plugin-pages-AHOA6YJE.js → plugin-pages-Q63UBSKH.js} +2 -2
- package/dist/{plugin-pages-AHOA6YJE.js.map → plugin-pages-Q63UBSKH.js.map} +1 -1
- package/dist/root-5TCUJI6Q.js +23 -0
- package/dist/{root-4FGNRGCD.js.map → root-5TCUJI6Q.js.map} +1 -1
- package/dist/{root-IIILTOJI.js → root-SMHRBFGW.js} +3 -3
- package/dist/{root-IIILTOJI.js.map → root-SMHRBFGW.js.map} +1 -1
- package/dist/root-VSTE2THV.js +2 -0
- package/dist/{root-5ZW536V7.js.map → root-VSTE2THV.js.map} +1 -1
- package/dist/{root-QPQQ3DFJ.js → root-VYZYDWIB.js} +2 -2
- package/dist/{root-QPQQ3DFJ.js.map → root-VYZYDWIB.js.map} +1 -1
- package/dist/{search-2K2BU4UU.js → search-K75Q65A6.js} +2 -2
- package/dist/{search-2K2BU4UU.js.map → search-K75Q65A6.js.map} +1 -1
- package/dist/{skills-pages-PSBRTFGK.js → skills-pages-KDG2NOQJ.js} +2 -2
- package/dist/{skills-pages-PSBRTFGK.js.map → skills-pages-KDG2NOQJ.js.map} +1 -1
- package/dist/tanstack-start.js +1 -1
- package/package.json +4 -4
- package/dist/chat-page-NWMI4XOE.js +0 -2
- package/dist/chat-page-NWMI4XOE.js.map +0 -1
- package/dist/chunk-GZIMMYLK.js +0 -2
- package/dist/chunk-NSYO57O3.js +0 -5
- package/dist/chunk-NSYO57O3.js.map +0 -1
- package/dist/chunk-QQUNCDUB.js +0 -2
- package/dist/chunk-W2EBZZAY.js +0 -3
- package/dist/chunk-W2EBZZAY.js.map +0 -1
- package/dist/chunk-YINI2YKQ.js +0 -4
- package/dist/list-SQCN7HA3.js +0 -2
- package/dist/pages-OIAPASPF.js +0 -3
- package/dist/pages-OIAPASPF.js.map +0 -1
- package/dist/root-4FGNRGCD.js +0 -23
- package/dist/root-5ZW536V7.js +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/ai/data-table-toolbar.tsx","../src/apps/ai/attach-combobox.tsx","../src/apps/ai/plugin-usage-picker.tsx","../src/apps/ai/form.tsx","../src/apps/ai/pages.tsx"],"names":["statusOptions","visibilityOptions","debounce","fn","ms","timeoutId","debounced","args","AutomationsDataTableToolbar","actions","isSearchLoading","onSearchChange","search","searchPlaceholder","table","isFiltered","statusColumn","column","visibilityColumn","draftSearch","setDraftSearch","useState","trimmedDraft","trimmedSearch","isSearchPending","onSearchChangeRef","useRef","debouncedSearchChange","useMemo","query","useEffect","clearSearch","handleReset","jsx","jsxs","ScrollArea","LoaderCircle","SearchIcon","Input","event","value","Button","ResetIcon","DataTableFacetedFilter","ScrollBar","matchLabel","_value","keywords","keyword","AttachCombobox","disabled","emptyText","footer","items","onToggle","open","setOpen","searchRef","Popover","PopoverTrigger","ChevronDownIcon","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","item","CommandItem","LockIcon","CheckIcon","Badge","scopeName","scope","connectedAccounts","plugin","connection","resolvePluginConnection","choice","accounts","choiceValue","PluginAccountSelect","ariaLabel","scopes","onChange","options","primary","only","pinned","account","selected","Select","option","next","entry","SelectTrigger","SelectValue","SelectContent","SelectItem","MAX_VISIBLE_TOOL_NAMES","usableScopes","emptyUsage","personal","toolKey","server","tool","toolName","key","selectedToolsSummary","selectedTools","names","visible","PluginToolRow","canManage","projectId","usage","onRemove","hasAccounts","data","error","useSWR","fetcher","available","serverErrors","allTools","locked","setTools","selectAllTools","withAccount","mutate","useSWRConfig","connecting","setConnecting","connect","connectPluginPopup","createApiClient","failure","toast","status","Fragment","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","checked","current","PluginConnectControl","Trash2Icon","Separator","AddPluginTools","plugins","onAdd","PlusIcon","PluginUsagePicker","toolPlugins","pluginsById","addable","TOOL_PROVIDERS","TRIGGER_EVENTS","HOURLY_CRON","DEFAULT_DAILY_CRON","DEFAULT_WEEKLY_CRON","DEFAULT_CUSTOM_CRON","DAY_OPTIONS","HOUR_OPTIONS","_","hour","isFormValidationClean","validation","usesEnabledPersonalPlugin","usages","FieldError","id","message","TriangleAlertIcon","createTriggerKey","getInitialTriggers","automation","trigger","getCustomToolsStatus","customTools","getLocalTimezone","generateWebhookSecret","bytes","byte","parseScheduleKind","cron","daily","weekly","getNextRuns","timezone","count","expression","CronExpressionParser","formatRunDate","date","getCronError","trimmed","fieldCount","getModelOptions","models","mode","selectedModelKey","activeModels","model","selectedModel","findModelByKey","getModelKey","getChannelKey","channel","mergeChannels","selectedChannels","availableChannels","channelsByKey","getInitialProviderToolFormData","providerTools","getInitialToolsFormData","tools","ChannelPicker","channels","loading","onRefresh","provider","setQuery","containerRef","selectedIds","providerLabel","filteredChannels","handlePointerDown","target","handleKeyDown","handleSelect","selectedChannel","handleRemove","channelId","XIcon","ChevronsUpDownIcon","LoaderCircleIcon","RefreshCwIcon","NextRunLabel","nextRun","HourSelect","DaySelect","day","CronEditor","nextRuns","run","ScheduleTriggerRow","kind","WebhookTriggerRow","copiedUrl","setCopiedUrl","copiedSecret","setCopiedSecret","url","getWebhookTriggerUrl","copyToClipboard","text","markCopied","Tooltip","TooltipTrigger","CopyIcon","TooltipContent","KeyRoundIcon","EntityTriggerRow","entities","toggleEvent","events","toggleEntity","entity","entityLabel","DropdownMenuCheckboxItem","TriggersField","errors","triggers","hasWebhookTrigger","addTrigger","addScheduleTrigger","updateTrigger","updated","removeTrigger","ClockIcon","WebhookIcon","DatabaseZapIcon","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent","SlackIcon","TeamsIcon","isSkillAttachable","skill","visibility","spaceId","isSpaceSkillLocked","getLockedSpaceSkillHint","spaceLabelById","spaceLabel","fetchSkillOrNull","skillId","paths","FetcherError","AutomationForm","api","onSaved","pluginUsages","setPluginUsages","name","setName","instructions","setInstructions","enabled","setEnabled","modelKey","setModelKey","effort","setEffort","mutationPolicy","setMutationPolicy","toolAllowRules","setToolAllowRules","setVisibility","setSpaceId","skillIds","setSkillIds","customToolNames","setCustomToolNames","setTriggers","isSaving","setIsSaving","setMessage","touched","setTouched","toolsFormData","setToolsFormData","connectingProvider","setConnectingProvider","revalidateKey","deliveryConnectionIds","setDeliveryConnectionIds","channelRequestRef","toolsFormKeyRef","marketplaceData","marketplaceError","marketplaceSettled","toolsUrl","toolsData","toolsError","entitiesData","spacesData","skillsData","auth","useAuth","canMutate","useCanMutate","userSpaceCodes","selectableSpaces","space","storedSelection","stored","parseModelSelection","modelOptions","effectiveModelKey","effectiveEffort","coerceEffort","effortOptions","getEffortOptions","effectiveModelId","formatModelSelection","listedSkillIds","unresolvedAttachedSkillIds","attachedSkillsKey","resolvedAttachedSkills","skillsById","attachableSkills","fromCatalog","catalogIds","lockedSpaceSkills","customToolsCatalog","customToolsByName","attachableCustomTools","catalogNames","customToolsStatus","waitingOnAttachedResolve","notFoundAttachedIds","personalPluginInUse","triggerErrors","cronError","toolErrors","isValid","showNameError","showInstructionsError","formKey","deliveryPlugins","resolvedDeliveryConnectionIds","resolve","loadProviderChannels","useCallback","connectionId","result","loadErrorMessage","handleConnectDelivery","resetProviderChannels","updateTool","handleDeliveryAccountChange","handleRemoveTool","toggleSkill","attached","toggleCustomTool","handleSubmit","toolConfigs","input","_key","Label","Switch","Textarea","nextModelKey","rule","BrainIcon","Icon","deliveryPlugin","GraduationCapIcon","label","WrenchIcon","PermissionTooltip","AUTOMATIONS_PAGE_SIZE","getLoadMoreThreshold","clientHeight","isRunHistoryScope","PageMessage","children","getStatusBadgeClass","StatusBadge","getScheduleSummary","getTriggerSummary","summaries","isAutomationRunnable","CreditButton","creditBalance","CoinsIcon","getVisibilityLabel","stickyTableHeaderClassName","AutomationsTableSkeleton","Table","TableHeader","TableRow","TableHead","TableBody","index","TableCell","Skeleton","columnFilterValues","filters","columnId","mapStatusFilterToEnabled","values","mapVisibilityFilter","AutomationsPage","useProjectApi","navigate","useNavigate","columnFilters","setColumnFilters","setSearch","scrollRef","statusFilterValues","visibilityFilterValues","enabledFilter","visibilityFilter","hasActiveFilters","filterKey","getAutomationsKey","pageIndex","previousPage","automationPages","isLoading","setSize","size","useSWRInfinite","automations","page","hasMore","isLoadingMore","automationsCount","isInitialLoading","filterColumns","useReactTable","getCoreRowModel","updater","onLoadMoreRef","currentSize","hasMoreRef","isLoadingMoreRef","checkLoadMore","container","scrollElement","scrollHeight","scrollTop","handleSearchChange","nextSearch","handleDelete","handleScroll","content","formatDistance","Ellipsis","Pencil","Trash2","SidebarTrigger","ExternalLink","Link","Plus","CreateAutomationPage","ArrowLeft","AutomationDetailPage","automationId","useParams","isRunning","startTransition","useTransition","automationApi","canRunAutomation","selectedAutomationId","handleRunNow","Tabs","TabsList","TabsTrigger","Play","RUNS_PAGE_SIZE","RunsPage","getRunsKey","runPages","runs","handleLoadMore","RunsTable","InfiniteScrollSentinel","onVisible","sentinelRef","onVisibleRef","node","observer","entries","RunsTableSkeleton","basePath","RunHistoryPage","setScope","getHistoryKey","historyPages","metrics","handleScopeChange","nextScope","metricsContent","MetricCard","APPROVALS_PAGE_SIZE","isApprovalStatusFilter","ApprovalsPage","statusFilter","setStatusFilter","selectedApprovalId","setSelectedApprovalId","getApprovalsKey","approvalPages","approvals","pendingCount","firstPage","revalidateApprovalsCount","useRevalidateApprovalsCount","selectedApproval","approval","handleStatusFilterChange","nextFilter","ApprovalStatusBadge","ApprovalDrawer","title","RunDetailPage","runId","latestData","isTerminalRunStatus","STREAM_RETRY_DELAY_MS","automationData","isCancelling","startCancelTransition","streamFinished","setStreamFinished","runApi","selectedRunId","showCancel","handleCancel","handleStreamFinished","handleRunUpdated","format","Conversation","ConversationContent","RunReplay","ConversationScrollButton","getRunReplayEmptyLabel","onRunUpdated","onStreamFinished","workflowRunId","streamApi","resumeToken","setResumeToken","suppressApprovalPause","setSuppressApprovalPause","stickyFallbackApprovals","setStickyFallbackApprovals","lastDecidedApprovalIdRef","useRunStream","rawMessages","messages","useSessionMessages","onRunUpdatedRef","onStreamFinishedRef","replayActions","approvalId","isAwaitingApproval","messageHasPendingMutationApproval","runEnded","streamHasPendingApproval","shouldLoadApprovalFallback","pendingApprovalsData","streamApprovalIds","getMutationApprovalIds","fallbackApprovals","streamIsOpen","hasReplayContent","byId","pendingIds","getPendingMutationApprovalIds","decidedId","intervalId","showStatusLine","lastPart","contentIsStreaming","statusLabel","getLiveStatusLabel","statusVisible","emptyLabel","RunReplayActionsContext","replayMessage","ReplayMessageView","MutationApprovalPart","toMutationApprovalPartData","TurnStatusLine","isUser","parts","part","isHiddenReplayPart","ZapIcon","BotIcon","MessagePart"],"mappings":"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","file":"pages-OIAPASPF.js","sourcesContent":["'use client';\n\nimport { useEffect, useMemo, useRef, useState, type JSX, type ReactNode } from 'react';\nimport { LoaderCircle, Search as SearchIcon, X as ResetIcon } from 'lucide-react';\nimport type { Table as ReactTable } from '@tanstack/react-table';\nimport { DataTableFacetedFilter } from '../../data-grid/data-table-faceted-filter';\nimport { Button, Input, ScrollArea, ScrollBar } from '../../ui';\n\nconst statusOptions = [\n { label: 'Enabled', value: 'enabled' },\n { label: 'Disabled', value: 'disabled' },\n];\n\nconst visibilityOptions = [\n { label: 'Project', value: 'project' },\n { label: 'Space', value: 'space' },\n { label: 'Personal', value: 'personal' },\n];\n\ninterface AutomationsDataTableToolbarProps<TData> {\n actions?: ReactNode;\n isSearchLoading?: boolean;\n onSearchChange: (search: string) => void;\n search: string;\n searchPlaceholder?: string;\n table: ReactTable<TData>;\n}\n\ntype DebouncedFn<TArgs extends unknown[]> = ((...args: TArgs) => void) & {\n cancel: () => void;\n};\n\nfunction debounce<TArgs extends unknown[]>(fn: (...args: TArgs) => void, ms = 300): DebouncedFn<TArgs> {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const debounced = function (this: unknown, ...args: TArgs) {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n fn.apply(this, args);\n }, ms);\n } as DebouncedFn<TArgs>;\n\n debounced.cancel = () => {\n if (timeoutId === undefined) {\n return;\n }\n\n clearTimeout(timeoutId);\n timeoutId = undefined;\n };\n\n return debounced;\n}\n\nexport function AutomationsDataTableToolbar<TData>({\n actions,\n isSearchLoading = false,\n onSearchChange,\n search,\n searchPlaceholder = 'Search automations...',\n table,\n}: AutomationsDataTableToolbarProps<TData>): JSX.Element {\n const isFiltered = table.getState().columnFilters.length > 0 || search.trim().length > 0;\n // table.getColumn(id) logs a dev-mode error when the column is missing, so\n // resolve optional filter columns by scanning instead.\n const statusColumn = table.getAllColumns().find((column) => column.id === 'status');\n const visibilityColumn = table.getAllColumns().find((column) => column.id === 'visibility');\n const [draftSearch, setDraftSearch] = useState(search);\n const trimmedDraft = draftSearch.trim();\n const trimmedSearch = search.trim();\n const isSearchPending = trimmedDraft.length > 0 && (isSearchLoading || trimmedDraft !== trimmedSearch);\n const onSearchChangeRef = useRef(onSearchChange);\n onSearchChangeRef.current = onSearchChange;\n const debouncedSearchChange = useMemo(\n () =>\n debounce((query: string) => {\n onSearchChangeRef.current(query);\n }, 300),\n []\n );\n\n useEffect(() => {\n setDraftSearch(search);\n }, [search]);\n\n useEffect(() => {\n return () => {\n debouncedSearchChange.cancel();\n };\n }, [debouncedSearchChange]);\n\n function clearSearch(): void {\n debouncedSearchChange.cancel();\n setDraftSearch('');\n onSearchChange('');\n }\n\n function handleReset(): void {\n table.resetColumnFilters();\n clearSearch();\n }\n\n return (\n <div className=\"fk:flex fk:w-full fk:min-w-0\">\n <ScrollArea className=\"fk:w-0 fk:min-w-0 fk:flex-1 fk:whitespace-nowrap fk:-ml-0.75\">\n <div className=\"fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-3 fk:p-0.75 fk:pb-2.5\">\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2\">\n <div className=\"fk:relative\">\n {isSearchPending ? (\n <LoaderCircle className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50 fk:animate-spin\" />\n ) : (\n <SearchIcon className=\"fk:absolute fk:left-2 fk:top-2 fk:h-4 fk:w-4 fk:shrink-0 fk:opacity-50\" />\n )}\n <Input\n className=\"fk:h-8 fk:w-37.5 fk:lg:w-70 fk:px-7 fk:text-sm\"\n name=\"search-automations\"\n placeholder={searchPlaceholder}\n value={draftSearch}\n onChange={(event) => {\n const { value } = event.target;\n setDraftSearch(value);\n\n if (value.trim().length === 0) {\n debouncedSearchChange.cancel();\n onSearchChange('');\n\n return;\n }\n\n debouncedSearchChange(value.trim());\n }}\n />\n {draftSearch ? (\n <Button\n aria-label=\"Clear search\"\n className=\"fk:absolute fk:right-1 fk:top-1 fk:h-6 fk:w-6 fk:text-muted-foreground fk:hover:text-foreground fk:hover:bg-foreground/10 fk:cursor-pointer fk:rounded-full fk:bg-transparent fk:corner-squircle\"\n onClick={clearSearch}\n type=\"button\"\n >\n <ResetIcon className=\"fk:h-4 fk:w-4\" />\n </Button>\n ) : null}\n </div>\n {statusColumn ? (\n <DataTableFacetedFilter column={statusColumn} options={statusOptions} title=\"Status\" />\n ) : null}\n {visibilityColumn ? (\n <DataTableFacetedFilter column={visibilityColumn} options={visibilityOptions} title=\"Visibility\" />\n ) : null}\n {isFiltered ? (\n <Button className=\"fk:h-8 fk:px-2 fk:lg:px-3\" onClick={handleReset} variant=\"ghost\">\n Reset\n <ResetIcon className=\"fk:ml-2 fk:h-4 fk:w-4\" />\n </Button>\n ) : null}\n </div>\n {actions ? <div className=\"fk:ml-auto fk:flex fk:shrink-0 fk:items-center fk:gap-3\">{actions}</div> : null}\n </div>\n <ScrollBar orientation=\"horizontal\" />\n </ScrollArea>\n </div>\n );\n}\n","import { useRef, useState, type JSX, type ReactNode } from 'react';\nimport { CheckIcon, ChevronDownIcon, LockIcon } from 'lucide-react';\nimport {\n Badge,\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '../../ui';\n\n/** Matches the visible name only; the default fuzzy scoring also matched hidden ids. */\nexport function matchLabel(_value: string, search: string, keywords?: string[]): number {\n return (keywords ?? []).some((keyword) => keyword.toLowerCase().includes(search.trim().toLowerCase())) ? 1 : 0;\n}\n\nexport interface AttachComboboxItem {\n id: string;\n label: string;\n attached: boolean;\n /** Shown as a small badge after the label, e.g. \"Code\". */\n badge?: string;\n /** Locked items are listed so users know they exist, but cannot be attached. */\n lockedHint?: string;\n}\n\n/** \"Attach\" button that opens a searchable multi-select list; it stays open while items are toggled. */\nexport function AttachCombobox({\n disabled,\n emptyText,\n footer,\n items,\n searchPlaceholder,\n onToggle,\n}: {\n disabled: boolean;\n emptyText: string;\n footer?: ReactNode;\n items: AttachComboboxItem[];\n searchPlaceholder: string;\n onToggle: (_id: string, _attached: boolean) => void;\n}): JSX.Element {\n const [open, setOpen] = useState(false);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button disabled={disabled} size=\"sm\" type=\"button\" variant=\"outline\">\n Attach\n <ChevronDownIcon className=\"fk:ml-1 fk:size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n className=\"fk:w-72 fk:p-0\"\n // Default autofocus runs before the popover is positioned and scrolls the form to the top.\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n searchRef.current?.focus({ preventScroll: true });\n }}\n >\n <Command filter={matchLabel}>\n <CommandInput placeholder={searchPlaceholder} ref={searchRef} />\n <CommandList className=\"fk:max-h-72\">\n <CommandEmpty>{emptyText}</CommandEmpty>\n <CommandGroup>\n {items.map((item) => (\n <CommandItem\n disabled={Boolean(item.lockedHint)}\n key={item.id}\n title={item.lockedHint}\n value={item.id}\n keywords={[item.label]}\n onSelect={() => onToggle(item.id, !item.attached)}\n >\n {item.lockedHint ? (\n <LockIcon className=\"fk:size-4\" />\n ) : (\n <CheckIcon className={item.attached ? 'fk:size-4' : 'fk:size-4 fk:opacity-0'} />\n )}\n <span className=\"fk:truncate\">{item.label}</span>\n {item.badge ? (\n <Badge className=\"fk:ml-auto fk:py-0 fk:text-[10px]\" variant=\"secondary\">\n {item.badge}\n </Badge>\n ) : null}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n {footer}\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","import { useRef, useState, type JSX } from 'react';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { CheckIcon, ChevronDownIcon, PlusIcon, Trash2Icon } from 'lucide-react';\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Separator,\n toast,\n} from '../../ui';\nimport { createApiClient, fetcher } from './api';\nimport { matchLabel } from './attach-combobox';\nimport { connectPluginPopup } from './plugin-oauth';\nimport { PluginConnectControl } from './plugin-pages';\nimport type { Marketplace, MarketplacePlugin, PluginConnection, PluginScope, PluginTools } from './plugin-types';\nimport type { AutomationToolConfigInput } from './types';\n\nexport interface PluginAccountChoice {\n connectionMode: PluginScope;\n /** null = the primary account of `connectionMode`, resolved at run time. */\n connectionId: string | null;\n}\n\nfunction scopeName(scope: PluginScope): string {\n return scope === 'project' ? 'Project' : 'Personal';\n}\n\nfunction connectedAccounts(plugin: MarketplacePlugin, scope: PluginScope): PluginConnection[] {\n return plugin.connections.filter((connection) => connection.scope === scope && connection.status === 'connected');\n}\n\n/** The connection a choice points at: the pinned account, or the scope's primary when unpinned. */\nexport function resolvePluginConnection(\n plugin: MarketplacePlugin,\n choice: PluginAccountChoice | null\n): PluginConnection | null {\n if (!choice) {\n return null;\n }\n\n const accounts = connectedAccounts(plugin, choice.connectionMode);\n\n if (choice.connectionId) {\n return accounts.find((connection) => connection.id === choice.connectionId) ?? null;\n }\n\n return accounts.find((connection) => connection.isPrimary) ?? null;\n}\n\nfunction choiceValue(choice: PluginAccountChoice | null): string {\n if (!choice) {\n return '';\n }\n\n return choice.connectionId ? `account:${choice.connectionId}` : `primary:${choice.connectionMode}`;\n}\n\nexport function PluginAccountSelect({\n ariaLabel,\n disabled,\n plugin,\n scopes,\n value,\n onChange,\n}: {\n ariaLabel: string;\n disabled?: boolean;\n plugin: MarketplacePlugin;\n scopes: PluginScope[];\n value: PluginAccountChoice | null;\n onChange: (_choice: PluginAccountChoice) => void;\n}): JSX.Element {\n const options: Array<{ choice: PluginAccountChoice; label: string }> = [];\n\n for (const scope of scopes) {\n const accounts = connectedAccounts(plugin, scope);\n const primary = accounts.find((connection) => connection.isPrimary);\n const [only] = accounts;\n\n // \"Primary\" and pinning the same single account read as duplicates; offer one entry.\n if (accounts.length === 1 && only) {\n const pinned = value?.connectionMode === scope && value.connectionId === only.id;\n options.push({\n // Follow the primary unless it is pinned, or the primary is not this (connected) account.\n choice: { connectionMode: scope, connectionId: pinned || !only.isPrimary ? only.id : null },\n label: `${scopeName(scope)} · ${only.displayName}`,\n });\n continue;\n }\n\n if (primary) {\n options.push({\n choice: { connectionMode: scope, connectionId: null },\n label: `Primary ${scope} account (${primary.displayName})`,\n });\n }\n\n for (const account of accounts) {\n options.push({\n choice: { connectionMode: scope, connectionId: account.id },\n label: `${scopeName(scope)} · ${account.displayName}`,\n });\n }\n }\n\n const selected = choiceValue(value);\n\n return (\n <Select\n disabled={disabled}\n value={options.some((option) => choiceValue(option.choice) === selected) ? selected : ''}\n onValueChange={(next) => {\n const option = options.find((entry) => choiceValue(entry.choice) === next);\n\n if (option) {\n onChange(option.choice);\n }\n }}\n >\n <SelectTrigger aria-label={ariaLabel} className=\"fk:w-fit fk:max-w-full\" size=\"sm\">\n <SelectValue placeholder=\"Select account\" />\n </SelectTrigger>\n <SelectContent>\n {options.map((option) => (\n <SelectItem key={choiceValue(option.choice)} value={choiceValue(option.choice)}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nconst MAX_VISIBLE_TOOL_NAMES = 2;\n\n/** Scopes an automation may use for this plugin: what it supports, minus personal when policy forbids it. */\nfunction usableScopes(plugin: MarketplacePlugin): PluginScope[] {\n return plugin.scopes.filter((scope) => scope === 'project' || plugin.allowPersonal);\n}\n\nfunction emptyUsage(plugin: MarketplacePlugin): AutomationToolConfigInput {\n // Start on the project account when one exists, otherwise on the user's own.\n const scopes = usableScopes(plugin);\n const personal =\n scopes.includes('personal') &&\n (!scopes.includes('project') ||\n (connectedAccounts(plugin, 'project').length === 0 && connectedAccounts(plugin, 'personal').length > 0));\n\n return {\n pluginId: plugin.id,\n enabled: true,\n connectionMode: personal ? 'personal' : 'project',\n connectionId: null,\n allTools: true,\n selectedTools: [],\n deliveryEnabled: false,\n channels: [],\n };\n}\n\nfunction toolKey(server: string, tool: string): string {\n return `${encodeURIComponent(server)}:${encodeURIComponent(tool)}`;\n}\n\nfunction toolName(key: string): string {\n return decodeURIComponent(key.slice(key.indexOf(':') + 1));\n}\n\nfunction selectedToolsSummary(selectedTools: string[]): string {\n const names = selectedTools.map(toolName);\n const visible = names.slice(0, MAX_VISIBLE_TOOL_NAMES).join(', ');\n\n return names.length > MAX_VISIBLE_TOOL_NAMES ? `${visible} +${names.length - MAX_VISIBLE_TOOL_NAMES} more` : visible;\n}\n\nfunction PluginToolRow({\n canManage,\n disabled,\n plugin,\n projectId,\n usage,\n onChange,\n onRemove,\n}: {\n canManage: boolean;\n disabled: boolean;\n plugin: MarketplacePlugin;\n projectId: string;\n usage: AutomationToolConfigInput;\n onChange: (_usage: AutomationToolConfigInput) => void;\n onRemove: () => void;\n}): JSX.Element {\n const scopes = usableScopes(plugin);\n const hasAccounts = scopes.some((scope) => connectedAccounts(plugin, scope).length > 0);\n const choice: PluginAccountChoice | null = scopes.includes(usage.connectionMode)\n ? { connectionMode: usage.connectionMode, connectionId: usage.connectionId }\n : null;\n const connection = resolvePluginConnection(plugin, choice);\n const { data, error } = useSWR<PluginTools>(\n connection ? `/api/flexkit/${projectId}/plugin-connections/${connection.id}/tools` : null,\n fetcher\n );\n const available = (data?.servers ?? []).flatMap((server) =>\n server.tools.map((entry) => ({ key: toolKey(server.name, entry.name), entry }))\n );\n const serverErrors = (data?.servers ?? []).flatMap((server) => (server.error ? [server.error] : []));\n // Rows saved before tool customization existed carry no flag and offer every tool.\n const allTools = usage.allTools !== false;\n const locked = disabled || !plugin.enabled;\n const setTools = (selectedTools: string[]) =>\n onChange({ ...usage, allTools: false, selectedTools, enabled: selectedTools.length > 0 });\n const selectAllTools = () => onChange({ ...usage, allTools: true, selectedTools: [], enabled: true });\n // A new account may expose other tools; only a custom selection has to be picked again.\n const withAccount = (next: PluginAccountChoice): AutomationToolConfigInput => ({\n ...usage,\n connectionMode: next.connectionMode,\n connectionId: next.connectionId,\n selectedTools: [],\n enabled: allTools,\n });\n const { mutate } = useSWRConfig();\n const [connecting, setConnecting] = useState(false);\n // Connects in a popup so the unsaved automation stays on screen, then uses the new account's primary.\n const connect = async (scope: PluginScope) => {\n setConnecting(true);\n\n try {\n await connectPluginPopup(createApiClient(projectId), plugin.id, scope);\n await mutate(`/api/flexkit/${projectId}/plugins`);\n onChange(withAccount({ connectionMode: scope, connectionId: null }));\n } catch (failure) {\n toast.error(failure instanceof Error ? failure.message : `Unable to connect ${plugin.name}.`);\n } finally {\n setConnecting(false);\n }\n };\n let status: { text: string; tone: 'muted' | 'warning' } | null = null;\n\n if (!plugin.enabled) {\n status = { text: 'Disabled by project policy.', tone: 'warning' };\n } else if (!hasAccounts) {\n status = { text: `Connect ${plugin.name} to use its tools.`, tone: 'warning' };\n } else if (!choice) {\n status = { text: 'Select an account.', tone: 'warning' };\n } else if (!connection) {\n status = {\n text: choice.connectionId\n ? 'The selected account is no longer connected.'\n : `The primary ${choice.connectionMode} account needs reconnecting.`,\n tone: 'warning',\n };\n } else if (error || serverErrors.length) {\n status = { text: serverErrors[0] ?? 'Unable to load tools. Reconnect or try again.', tone: 'warning' };\n } else if (allTools) {\n status = { text: 'All tools', tone: 'muted' };\n } else if (usage.selectedTools.length === 0) {\n status = { text: 'No tools selected, so the agent cannot use this plugin yet.', tone: 'warning' };\n } else {\n status = { text: selectedToolsSummary(usage.selectedTools), tone: 'muted' };\n }\n\n return (\n <>\n <div className=\"fk:m-1.5 fk:flex fk:flex-wrap fk:items-center fk:justify-between fk:gap-x-3 fk:gap-y-2 fk:rounded-md fk:px-1.25 fk:py-1.5 fk:hover:bg-muted fk:corner-squircle\">\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2.5\">\n <img src={plugin.logoUrl} alt=\"\" className=\"fk:size-5 fk:shrink-0 fk:rounded fk:corner-squircle fk:self-start\" />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:text-sm fk:font-medium\">{plugin.name}</div>\n <p\n className={\n status.tone === 'warning'\n ? 'fk:truncate fk:text-xs fk:text-warning'\n : 'fk:truncate fk:text-xs fk:text-muted-foreground'\n }\n >\n {status.text}\n </p>\n {usage.connectionMode === 'personal' && usage.enabled ? (\n <p className=\"fk:text-xs fk:text-muted-foreground\">Using your account makes this automation personal.</p>\n ) : null}\n </div>\n </div>\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-1.5\">\n {hasAccounts ? (\n <>\n <PluginAccountSelect\n ariaLabel={`${plugin.name} account`}\n disabled={locked}\n plugin={plugin}\n scopes={scopes}\n value={choice}\n onChange={(next) => {\n if (next.connectionMode === usage.connectionMode && next.connectionId === usage.connectionId) {\n return;\n }\n\n onChange(withAccount(next));\n }}\n />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button disabled={locked || !connection || !data} size=\"sm\" type=\"button\" variant=\"outline\">\n {allTools ? 'All tools' : usage.selectedTools.length ? `Tools (${usage.selectedTools.length})` : 'Select tools'}\n <ChevronDownIcon className=\"fk:ml-1 fk:size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:max-h-80 fk:w-80 fk:overflow-y-auto\">\n <DropdownMenuItem\n className=\"fk:items-start\"\n onSelect={(event) => {\n event.preventDefault();\n\n // Leaving \"All tools\" keeps every current tool checked, so nothing disappears.\n if (allTools) {\n setTools(available.map((tool) => tool.key));\n } else {\n selectAllTools();\n }\n }}\n >\n <CheckIcon className={allTools ? 'fk:mt-0.5 fk:size-4' : 'fk:mt-0.5 fk:size-4 fk:opacity-0'} />\n <span className=\"fk:min-w-0\">\n <span className=\"fk:block\">All tools (recommended)</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Includes tools added later. Uncheck to pick specific ones.\n </span>\n </span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n {available.map(({ key, entry }) => {\n const checked = allTools || usage.selectedTools.includes(key);\n\n return (\n <DropdownMenuItem\n className=\"fk:items-start\"\n key={key}\n onSelect={(event) => {\n event.preventDefault();\n const current = allTools ? available.map((tool) => tool.key) : usage.selectedTools;\n setTools(checked ? current.filter((item) => item !== key) : [...current, key]);\n }}\n >\n <CheckIcon className={checked ? 'fk:mt-0.5 fk:size-4' : 'fk:mt-0.5 fk:size-4 fk:opacity-0'} />\n <span className=\"fk:min-w-0\">\n <span className=\"fk:block\">{entry.name}</span>\n {entry.description ? (\n <span className=\"fk:line-clamp-2 fk:text-xs fk:text-muted-foreground\">{entry.description}</span>\n ) : null}\n </span>\n </DropdownMenuItem>\n );\n })}\n {data && available.length === 0 ? (\n <DropdownMenuItem disabled>This account exposes no tools.</DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n ) : (\n <PluginConnectControl\n busy={connecting || disabled}\n canManage={canManage}\n plugin={plugin}\n onConnect={(scope) => void connect(scope)}\n />\n )}\n <Button\n aria-label={`Remove ${plugin.name} from automation`}\n disabled={disabled}\n size=\"icon\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onRemove}\n >\n <Trash2Icon className=\"fk:size-4\" />\n </Button>\n </div>\n </div>\n <Separator/>\n </>\n );\n}\n\nfunction AddPluginTools({\n disabled,\n plugins,\n onAdd,\n}: {\n disabled: boolean;\n plugins: MarketplacePlugin[];\n onAdd: (_plugin: MarketplacePlugin) => void;\n}): JSX.Element {\n const [open, setOpen] = useState(false);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n className=\"fk:m-1.5 fk:flex fk:w-[calc(100%-0.75rem)] fk:cursor-pointer fk:items-center fk:gap-2.5 fk:rounded-md fk:px-1.25 fk:py-1.5 fk:text-left fk:text-sm fk:text-muted-foreground fk:hover:bg-muted fk:hover:text-foreground disabled:fk:cursor-not-allowed disabled:fk:opacity-50 fk:corner-squircle\"\n disabled={disabled || plugins.length === 0}\n type=\"button\"\n >\n <PlusIcon className=\"fk:size-5\" />\n Plugin tools\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"fk:w-72 fk:p-0\"\n // Default autofocus runs before the popover is positioned and scrolls the form to the top.\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n searchRef.current?.focus({ preventScroll: true });\n }}\n >\n <Command filter={matchLabel}>\n <CommandInput placeholder=\"Search plugins…\" ref={searchRef} />\n <CommandList>\n <CommandEmpty>No plugins found.</CommandEmpty>\n <CommandGroup>\n {plugins.map((plugin) => (\n <CommandItem\n key={plugin.id}\n value={plugin.id}\n keywords={[plugin.name]}\n onSelect={() => {\n onAdd(plugin);\n setOpen(false);\n }}\n >\n <img src={plugin.logoUrl} alt=\"\" className=\"fk:size-5 fk:shrink-0 fk:rounded fk:corner-squircle\" />\n <span className=\"fk:truncate\">{plugin.name}</span>\n {plugin.connections.some((connection) => connection.status === 'connected') ? null : (\n <span className=\"fk:ml-auto fk:text-xs fk:text-muted-foreground\">Not connected</span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n\n/**\n * One row per plugin added to the automation, then a \"+ Plugin tools\" row to\n * add another. Plugins that are not added stay unavailable to the run.\n */\nexport function PluginUsagePicker({\n projectId,\n value,\n disabled,\n onChange,\n}: {\n projectId: string;\n value: AutomationToolConfigInput[];\n disabled: boolean;\n onChange: (value: AutomationToolConfigInput[]) => void;\n}): JSX.Element {\n const { data, error } = useSWR<Marketplace>(`/api/flexkit/${projectId}/plugins`, fetcher);\n const toolPlugins = (data?.plugins ?? []).filter((plugin) => plugin.capabilities.agentTools);\n const pluginsById = new Map(toolPlugins.map((plugin) => [plugin.id, plugin]));\n const addable = toolPlugins.filter(\n (plugin) => plugin.enabled && !value.some((usage) => usage.pluginId === plugin.id)\n );\n\n return (\n <>\n {value.map((usage) => {\n const plugin = pluginsById.get(usage.pluginId);\n\n return plugin ? (\n <PluginToolRow\n disabled={disabled}\n canManage={data?.canManage ?? false}\n key={usage.pluginId}\n plugin={plugin}\n projectId={projectId}\n usage={usage}\n onChange={(next) => onChange(value.map((entry) => (entry.pluginId === plugin.id ? next : entry)))}\n onRemove={() => onChange(value.filter((entry) => entry.pluginId !== plugin.id))}\n />\n ) : null;\n })}\n {error ? (\n <p className=\"fk:mx-3 fk:text-xs fk:text-warning\" role=\"alert\">\n Unable to load plugins. Your existing selections are preserved.\n </p>\n ) : null}\n <AddPluginTools\n disabled={disabled || !data}\n plugins={addable}\n onAdd={(plugin) => onChange([...value, emptyUsage(plugin)])}\n />\n </>\n );\n}\n","import { PluginAccountSelect, PluginUsagePicker, resolvePluginConnection } from './plugin-usage-picker';\nimport type { Marketplace } from './plugin-types';\nimport type { FormEvent, JSX } from 'react';\nimport { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport useSWR, { useSWRConfig } from 'swr';\nimport { connectPluginPopup } from './plugin-oauth';\nimport { AttachCombobox } from './attach-combobox';\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 PermissionTooltip,\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 '../../ui';\nimport {\n BrainIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronsUpDownIcon,\n ClockIcon,\n CopyIcon,\n DatabaseZapIcon,\n GraduationCapIcon,\n KeyRoundIcon,\n LoaderCircleIcon,\n PlusIcon,\n RefreshCwIcon,\n Trash2Icon,\n TriangleAlertIcon,\n WebhookIcon,\n WrenchIcon,\n XIcon,\n} from 'lucide-react';\nimport { useAuth } from '../../auth/auth-context';\nimport { useCanMutate } from '../../core/permissions';\nimport { fetcher, FetcherError, getWebhookTriggerUrl, paths, type ApiClient } from './api';\nimport {\n coerceEffort,\n findModelByKey,\n formatModelSelection,\n getEffortOptions,\n getModelKey,\n parseModelSelection,\n} from './model-selection';\nimport type {\n Automation,\n AutomationEntityTrigger,\n AutomationInput,\n AutomationMutationPolicy,\n AutomationToolAllowRule,\n AutomationScheduleTrigger,\n AutomationCustomTools,\n AutomationTools,\n AutomationToolChannel,\n AutomationToolConfigInput,\n AutomationToolProvider,\n AutomationTrigger,\n AutomationTriggerEvent,\n AutomationProviderTools,\n AutomationVisibility,\n AutomationWebhookTrigger,\n ProjectSpace,\n Skill,\n SkillsList,\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 plugins: string;\n space: 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 !validation.plugins &&\n !validation.space &&\n Object.keys(validation.toolErrors).length === 0 &&\n Object.keys(validation.triggerErrors).length === 0\n );\n}\n\nfunction usesEnabledPersonalPlugin(usages: AutomationToolConfigInput[]): boolean {\n return usages.some((usage) => usage.enabled && usage.connectionMode === 'personal');\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 getCustomToolsStatus(customTools: AutomationCustomTools): string {\n if (customTools.connected && customTools.connectionLabel) {\n return `While your local runtime (${customTools.connectionLabel}) is connected, manually running this automation uses its custom tools so you can test them.`;\n }\n\n if (customTools.connected) {\n return 'While `flexkit dev` is connected, manually running this automation uses the custom tools from your local runtime so you can test them.';\n }\n\n if (customTools.origin) {\n return `Using ${customTools.origin}`;\n }\n\n if (customTools.tools.length === 0) {\n return '';\n }\n\n return 'Registered in this project';\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 selectedModelKey: string\n): AutomationTools['models'] {\n const activeModels = models.filter((model) => !model.deprecated);\n\n if (mode !== 'edit' || !selectedModelKey) {\n return activeModels;\n }\n\n const selectedModel = findModelByKey(models, selectedModelKey);\n\n if (selectedModel?.deprecated) {\n return [selectedModel, ...activeModels.filter((model) => getModelKey(model) !== selectedModelKey)];\n }\n\n if (!selectedModel) {\n // A stored id the catalog no longer lists stays selectable and is sent back unchanged.\n return [\n {\n deprecated: true,\n effort: null,\n efforts: [],\n id: selectedModelKey,\n kind: 'model',\n name: selectedModelKey,\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 fk:corner-squircle\"\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 fk:corner-squircle\">\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:h-auto fk:w-full fk:justify-start fk:rounded-sm fk:px-2 fk:py-1.5 fk:font-normal fk:corner-squircle\"\n key={getChannelKey(channel)}\n type=\"button\"\n variant=\"ghost\"\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:h-auto fk:gap-1.5 fk:bg-background/90 fk:px-2 fk:py-1 fk:font-mono fk:font-normal fk:shadow-sm hover:fk:bg-accent\"\n type=\"button\"\n variant=\"ghost\"\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 fk:corner-squircle\">\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:h-auto fk:min-w-0 fk:max-w-60 fk:gap-1.5 fk:bg-background/90 fk:px-2 fk:py-1 fk:text-xs fk:font-normal fk:shadow-sm hover:fk:bg-accent\"\n type=\"button\"\n variant=\"ghost\"\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 fk:corner-squircle\">\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 fk:corner-squircle\" 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:h-auto fk:w-full fk:justify-start fk:gap-3 fk:px-3 fk:py-3 fk:text-muted-foreground hover:fk:bg-muted hover:fk:text-foreground ${triggers.length === 0 ? 'fk:rounded-lg fk:corner-squircle' : 'fk:rounded-none fk:rounded-b-lg fk:corner-squircle'}`}\n type=\"button\"\n variant=\"ghost\"\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\n// Mirrors the server-side attachment guard: project skills attach anywhere,\n// space skills only within the same space, personal skills only to personal\n// automations.\nfunction isSkillAttachable(\n skill: Pick<Skill, 'spaceId' | 'visibility'>,\n visibility: AutomationVisibility,\n spaceId: string | null\n): boolean {\n if (skill.visibility === 'space') {\n return visibility === 'space' && spaceId !== null && skill.spaceId === spaceId;\n }\n\n if (skill.visibility === 'personal') {\n return visibility === 'personal';\n }\n\n return true;\n}\n\nfunction isSpaceSkillLocked(\n skill: Pick<Skill, 'spaceId' | 'visibility'>,\n visibility: AutomationVisibility,\n spaceId: string | null\n): boolean {\n return skill.visibility === 'space' && !isSkillAttachable(skill, visibility, spaceId);\n}\n\nfunction getLockedSpaceSkillHint(skill: Pick<Skill, 'spaceId'>, spaceLabelById: { [id: string]: string }): string {\n const spaceLabel = skill.spaceId ? spaceLabelById[skill.spaceId] : undefined;\n\n if (spaceLabel) {\n return `Only available on ${spaceLabel} automations`;\n }\n\n return 'Only available on space automations';\n}\n\nasync function fetchSkillOrNull(projectId: string, skillId: string): Promise<Skill | null> {\n try {\n const data = await fetcher<{ skill: Skill }>(paths(projectId).skill(skillId));\n\n return data.skill;\n } catch (error) {\n // Only a genuine 404 means the skill was deleted and is safe to prune.\n // Transient failures (network/5xx) must rethrow so SWR surfaces an error\n // and retries instead of us reporting the skill as \"not found\", which\n // would silently detach a still-existing attachment on save.\n if (error instanceof FetcherError && error.status === 404) {\n return null;\n }\n\n throw error;\n }\n}\n\nexport function AutomationForm({ api, automation, mode, onSaved, projectId }: AutomationFormProps): JSX.Element {\n const [pluginUsages, setPluginUsages] = useState<AutomationToolConfigInput[]>((automation?.toolConfigs ?? []).filter((entry) => !['slack', 'teams'].includes(entry.pluginId)));\n const [name, setName] = useState(automation?.name ?? '');\n const [instructions, setInstructions] = useState(automation?.instructions ?? '');\n const [enabled, setEnabled] = useState(automation?.enabled ?? false);\n // Null until the user picks; until then the stored id, parsed once the catalog arrives, applies.\n const [modelKey, setModelKey] = useState<string | null>(null);\n const [effort, setEffort] = useState<string | null>(null);\n const [mutationPolicy, setMutationPolicy] = useState<AutomationMutationPolicy>(\n automation?.mutationPolicy ?? 'require_approval'\n );\n // Undefined when the loaded automation did not carry the rules (older API):\n // the save then omits the field, which the API treats as \"keep\", so a plain\n // save can never wipe rules created from the Approvals inbox.\n const [toolAllowRules, setToolAllowRules] = useState<AutomationToolAllowRule[] | undefined>(\n automation?.toolAllowRules\n );\n const [visibility, setVisibility] = useState<AutomationVisibility>(automation?.visibility ?? 'project');\n const [spaceId, setSpaceId] = useState<string | null>(automation?.spaceId ?? null);\n const [skillIds, setSkillIds] = useState<string[]>(automation?.skillIds ?? []);\n const [customToolNames, setCustomToolNames] = useState<string[]>(automation?.customToolNames ?? []);\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 [connectingProvider, setConnectingProvider] = useState<AutomationToolProvider | null>(null);\n const { mutate: revalidateKey } = useSWRConfig();\n // Pinned delivery workspace per provider; null = the provider's primary project account.\n const [deliveryConnectionIds, setDeliveryConnectionIds] = useState<{ [provider in AutomationToolProvider]: string | null }>(\n () => ({\n slack: automation?.toolConfigs?.find((entry) => entry.pluginId === 'slack')?.connectionId ?? null,\n teams: automation?.toolConfigs?.find((entry) => entry.pluginId === 'teams')?.connectionId ?? null,\n })\n );\n const channelRequestRef = useRef<{ [provider in AutomationToolProvider]?: string | null }>({});\n // Tools form state is seeded once per automation; SWR refetches (e.g. on window focus after\n // a connect popup) must not discard local edits.\n const toolsFormKeyRef = useRef<string | null>(null);\n const { data: marketplaceData, error: marketplaceError } = useSWR<Marketplace>(\n `/api/flexkit/${projectId}/plugins`,\n fetcher\n );\n const marketplaceSettled = Boolean(marketplaceData || marketplaceError);\n const toolsUrl = paths(projectId).tools(automation?.id);\n const { data: toolsData, error: toolsError } = useSWR<ToolsResponse>(toolsUrl, fetcher);\n const { data: entitiesData } = useSWR<{ entities: string[] }>(paths(projectId).entities, fetcher);\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(paths(projectId).spaces, fetcher);\n // Catalog for the attach picker. The API caps a page at 100, so attached\n // skills may be missing from this list — those are resolved separately.\n const { data: skillsData } = useSWR<SkillsList>(paths(projectId).skills({ limit: 100 }), fetcher);\n const [, auth] = useAuth();\n const canMutate = useCanMutate();\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only spaces the caller belongs to are offered; the server rejects\n // bindings to spaces outside the caller's membership anyway.\n const selectableSpaces = (spacesData?.spaces ?? []).filter((space) => userSpaceCodes.includes(space.code));\n const models = toolsData?.tools.models;\n const storedSelection = useMemo(() => {\n const stored = automation?.modelId ?? '';\n\n if (!stored) {\n return null;\n }\n\n return parseModelSelection(stored, models ?? []) ?? { effort: null, modelKey: stored };\n }, [automation?.modelId, models]);\n const selectedModelKey = modelKey ?? storedSelection?.modelKey ?? '';\n const modelOptions = useMemo(\n () => getModelOptions(models ?? [], mode, selectedModelKey),\n [mode, models, selectedModelKey]\n );\n // The API lists Auto first, so a new automation starts on Auto.\n const effectiveModelKey = selectedModelKey || (modelOptions[0] ? getModelKey(modelOptions[0]) : '');\n const selectedModel = findModelByKey(modelOptions, effectiveModelKey);\n const effectiveEffort = coerceEffort(selectedModel, effort ?? (modelKey === null ? (storedSelection?.effort ?? null) : null));\n const effortOptions = getEffortOptions(selectedModel);\n const effectiveModelId = effectiveModelKey\n ? formatModelSelection({ effort: effectiveEffort, modelKey: effectiveModelKey }, modelOptions)\n : '';\n const listedSkillIds = useMemo(\n () => new Set((skillsData?.skills ?? []).map((skill) => skill.id)),\n [skillsData?.skills]\n );\n // Attached ids absent from the catalog page (pagination) — fetch by id so\n // we can display them and prune on visibility changes without dropping\n // unknown ids just because they were not on this page.\n const unresolvedAttachedSkillIds = useMemo(() => {\n if (!skillsData) {\n return [];\n }\n\n return skillIds.filter((skillId) => !listedSkillIds.has(skillId)).sort();\n }, [listedSkillIds, skillIds, skillsData]);\n const attachedSkillsKey =\n unresolvedAttachedSkillIds.length > 0\n ? ([projectId, 'attached-skills', ...unresolvedAttachedSkillIds] as const)\n : null;\n const { data: resolvedAttachedSkills } = useSWR(attachedSkillsKey, () =>\n Promise.all(unresolvedAttachedSkillIds.map((skillId) => fetchSkillOrNull(projectId, skillId)))\n );\n const skillsById = useMemo(() => {\n const next: { [id: string]: Skill } = {};\n\n for (const skill of skillsData?.skills ?? []) {\n next[skill.id] = skill;\n }\n\n for (const skill of resolvedAttachedSkills ?? []) {\n if (skill) {\n next[skill.id] = skill;\n }\n }\n\n return next;\n }, [resolvedAttachedSkills, skillsData?.skills]);\n const attachableSkills = useMemo<Skill[]>(() => {\n const fromCatalog = (skillsData?.skills ?? []).filter((skill) => isSkillAttachable(skill, visibility, spaceId));\n const catalogIds = new Set(fromCatalog.map((skill) => skill.id));\n const attachedExtras = skillIds\n .map((skillId) => skillsById[skillId])\n .filter((skill): skill is Skill => {\n if (!skill || catalogIds.has(skill.id)) {\n return false;\n }\n\n return isSkillAttachable(skill, visibility, spaceId);\n });\n\n return [...attachedExtras, ...fromCatalog];\n }, [skillIds, skillsById, skillsData?.skills, spaceId, visibility]);\n const spaceLabelById = useMemo(() => {\n const next: { [id: string]: string } = {};\n\n for (const space of spacesData?.spaces ?? []) {\n next[space.id] = space.label;\n }\n\n return next;\n }, [spacesData?.spaces]);\n const lockedSpaceSkills = useMemo(\n () => (skillsData?.skills ?? []).filter((skill) => isSpaceSkillLocked(skill, visibility, spaceId)),\n [skillsData?.skills, spaceId, visibility]\n );\n const customToolsCatalog = toolsData?.tools.customTools;\n const customToolsByName = useMemo(() => {\n const next: { [name: string]: { description: string; name: string } } = {};\n\n for (const tool of customToolsCatalog?.tools ?? []) {\n next[tool.name] = tool;\n }\n\n return next;\n }, [customToolsCatalog?.tools]);\n const attachableCustomTools = useMemo(() => {\n const fromCatalog = customToolsCatalog?.tools ?? [];\n const catalogNames = new Set(fromCatalog.map((tool) => tool.name));\n const extras = customToolNames\n .filter((name) => !catalogNames.has(name))\n .map((name) => customToolsByName[name] ?? { description: '', name });\n\n return [...extras, ...fromCatalog];\n }, [customToolNames, customToolsByName, customToolsCatalog?.tools]);\n const customToolsStatus = customToolsCatalog\n ? getCustomToolsStatus(customToolsCatalog)\n : '';\n\n useEffect(() => {\n if (!skillsData) {\n return;\n }\n\n const waitingOnAttachedResolve = unresolvedAttachedSkillIds.length > 0 && resolvedAttachedSkills === undefined;\n const notFoundAttachedIds = new Set(\n waitingOnAttachedResolve ? [] : unresolvedAttachedSkillIds.filter((skillId) => !skillsById[skillId])\n );\n\n setSkillIds((current) => {\n const next = current.filter((skillId) => {\n if (notFoundAttachedIds.has(skillId)) {\n return false;\n }\n\n const skill = skillsById[skillId];\n\n // Keep off-page attachments until their detail resolve finishes; only\n // drop ids we know are incompatible with the current visibility/space.\n if (!skill) {\n return true;\n }\n\n return isSkillAttachable(skill, visibility, spaceId);\n });\n\n return next.length === current.length ? current : next;\n });\n }, [resolvedAttachedSkills, skillsById, skillsData, spaceId, unresolvedAttachedSkillIds, visibility]);\n const personalPluginInUse = usesEnabledPersonalPlugin(pluginUsages);\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 plugins:\n personalPluginInUse && visibility !== 'personal'\n ? 'Personal plugin connections can only be used by a personal automation.'\n : '',\n space: visibility === 'space' && !spaceId ? 'Select a space' : '',\n toolErrors,\n triggerErrors,\n };\n }, [effectiveModelId, instructions, name, personalPluginInUse, spaceId, toolsFormData, triggers, visibility]);\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 const formKey = `${automation?.id ?? ''}:${mode}`;\n\n if (!toolsData?.tools || toolsFormKeyRef.current === formKey) {\n return;\n }\n\n toolsFormKeyRef.current = formKey;\n setToolsFormData(getInitialToolsFormData(toolsData.tools, mode));\n }, [automation?.id, mode, toolsData?.tools]);\n\n const deliveryPlugins = useMemo(\n () => ({\n slack: marketplaceData?.plugins.find((plugin) => plugin.id === 'slack') ?? null,\n teams: marketplaceData?.plugins.find((plugin) => plugin.id === 'teams') ?? null,\n }),\n [marketplaceData]\n );\n const resolvedDeliveryConnectionIds = useMemo(() => {\n const resolve = (provider: AutomationToolProvider): string | null => {\n const plugin = deliveryPlugins[provider];\n\n return plugin\n ? (resolvePluginConnection(plugin, { connectionMode: 'project', connectionId: deliveryConnectionIds[provider] })\n ?.id ?? null)\n : null;\n };\n\n return { slack: resolve('slack'), teams: resolve('teams') };\n }, [deliveryConnectionIds, deliveryPlugins]);\n const loadProviderChannels = useCallback(\n async (provider: AutomationToolProvider, connectionId: string | null): Promise<void> => {\n channelRequestRef.current[provider] = connectionId;\n\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, connectionId);\n\n // A newer request for another account superseded this one.\n if (channelRequestRef.current[provider] !== connectionId) {\n return;\n }\n\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 if (channelRequestRef.current[provider] !== connectionId) {\n return;\n }\n\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 // Viewers cannot edit the channel selection and the channels endpoint\n // requires write access; the saved channels already render from the\n // automation's own tool config.\n // Wait for the plugin catalog so channels load from the selected account.\n if (!toolsFormData || !canMutate || !marketplaceSettled) {\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, resolvedDeliveryConnectionIds[provider]);\n }\n }\n }, [canMutate, loadProviderChannels, marketplaceSettled, resolvedDeliveryConnectionIds, toolsFormData]);\n\n // Connects the project workspace in a popup so unsaved edits stay on screen, then adds the destination.\n async function handleConnectDelivery(provider: AutomationToolProvider): Promise<void> {\n const plugin = deliveryPlugins[provider];\n\n if (!plugin) {\n return;\n }\n\n setConnectingProvider(provider);\n\n try {\n await connectPluginPopup(api, plugin.id, 'project');\n const catalog = (await revalidateKey(`/api/flexkit/${projectId}/plugins`)) as Marketplace | undefined;\n const primary = catalog?.plugins\n .find((entry) => entry.id === plugin.id)\n ?.connections.find(\n (connection) => connection.scope === 'project' && connection.isPrimary && connection.status === 'connected'\n );\n // Deliver through the new primary account; any previously pinned account and its channels are stale.\n setDeliveryConnectionIds((current) => ({ ...current, [provider]: null }));\n resetProviderChannels(provider, {\n connected: true,\n enabled: true,\n workspaceName: primary?.displayName ?? null,\n });\n } catch (failure) {\n toast.error(failure instanceof Error ? failure.message : `Unable to connect ${plugin.name}.`);\n } finally {\n setConnectingProvider(null);\n }\n }\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 handleDeliveryAccountChange(provider: AutomationToolProvider, connectionId: string | null): void {\n if (deliveryConnectionIds[provider] === connectionId) {\n return;\n }\n\n setDeliveryConnectionIds((current) => ({ ...current, [provider]: connectionId }));\n resetProviderChannels(provider);\n }\n\n // Channels belong to a workspace; drop them and any in-flight load so they reload for the selected account.\n function resetProviderChannels(\n provider: AutomationToolProvider,\n value: Partial<AutomationProviderToolFormData> = {}\n ): void {\n channelRequestRef.current[provider] = undefined;\n updateTool(provider, {\n ...value,\n availableChannels: [],\n channels: [],\n channelsLoaded: false,\n channelsLoadError: undefined,\n loadingChannels: false,\n });\n }\n\n function handleRemoveTool(provider: AutomationToolProvider): void {\n updateTool(provider, {\n channels: [],\n enabled: false,\n });\n }\n\n function toggleSkill(skillId: string, attached: boolean): void {\n setSkillIds((current) => {\n if (attached) {\n return current.includes(skillId) ? current : [...current, skillId];\n }\n\n return current.filter((id) => id !== skillId);\n });\n }\n\n function toggleCustomTool(toolName: string, attached: boolean): void {\n setCustomToolNames((current) => {\n if (attached) {\n return current.includes(toolName) ? current : [...current, toolName];\n }\n\n return current.filter((name) => name !== toolName);\n });\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>): Promise<void> {\n event.preventDefault();\n\n if (!canMutate) {\n return;\n }\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 pluginId: provider,\n connectionMode: 'project',\n connectionId: deliveryConnectionIds[provider],\n selectedTools: [],\n deliveryEnabled: providerTools?.enabled ?? false,\n };\n });\n const input: AutomationInput = {\n customToolNames,\n enabled,\n instructions,\n modelId: effectiveModelId,\n mutationPolicy,\n name,\n skillIds,\n ...(toolAllowRules !== undefined ? { toolAllowRules } : {}),\n spaceId: visibility === 'space' ? spaceId : null,\n toolConfigs: [...toolConfigs, ...pluginUsages],\n triggers: triggers.map(({ key: _key, ...trigger }) => trigger),\n visibility,\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-4xl 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 fk:corner-squircle\">\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\" htmlFor=\"automation-visibility\">\n Visibility\n </Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-2\">\n Who can see and manage this automation. Space automations are only visible to members of the selected space;\n personal automations are private to you.\n </p>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Select\n value={visibility}\n onValueChange={(value) => {\n if (personalPluginInUse && value !== 'personal') {\n return;\n }\n\n setVisibility(value === 'space' || value === 'personal' ? value : 'project');\n\n if (value !== 'space') {\n setSpaceId(null);\n }\n }}\n >\n <SelectTrigger aria-label=\"Visibility\" className=\"fk:w-fit\" id=\"automation-visibility\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"start\">\n <SelectItem disabled={personalPluginInUse} value=\"project\">\n Project\n </SelectItem>\n <SelectItem disabled={personalPluginInUse || selectableSpaces.length === 0} value=\"space\">\n Space\n </SelectItem>\n <SelectItem value=\"personal\">Personal</SelectItem>\n </SelectContent>\n </Select>\n {visibility === 'space' ? (\n <Select\n value={spaceId ?? ''}\n onValueChange={(value) => {\n setSpaceId(value || null);\n }}\n >\n <SelectTrigger aria-label=\"Space\" className=\"fk:w-fit\">\n <SelectValue placeholder=\"Select a space\" />\n </SelectTrigger>\n <SelectContent align=\"start\">\n {selectableSpaces.map((space) => (\n <SelectItem key={space.id} value={space.id}>\n {space.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n </div>\n {personalPluginInUse ? (\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n This automation uses a personal plugin connection, so project and space visibility are unavailable.\n </p>\n ) : null}\n {validation.plugins ? <FieldError message={validation.plugins} /> : null}\n {visibility === 'space' && validation.space ? <FieldError message={validation.space} /> : 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'} fk:corner-squircle`}\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)] fk:corner-squircle\"\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'} fk:corner-squircle`}\n >\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <Select\n value={effectiveModelKey}\n onValueChange={(nextModelKey) => {\n setModelKey(nextModelKey);\n // The new model's default effort applies until the user picks one.\n setEffort(null);\n }}\n >\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={getModelKey(model)} value={getModelKey(model)}>\n {model.name}\n {model.deprecated ? ' (Legacy)' : ''}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {effortOptions.length > 1 && effectiveEffort ? (\n <Select value={effectiveEffort} onValueChange={setEffort}>\n <SelectTrigger\n aria-label=\"Reasoning effort\"\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=\"Effort\" />\n </SelectTrigger>\n <SelectContent align=\"start\">\n {effortOptions.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n </div>\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-3\">\n <Label className=\"fk:mb-1\" htmlFor=\"automation-mutation-policy\">\n Mutations\n </Label>\n <p className=\"fk:text-xs fk:text-muted-foreground fk:mb-2\">\n How data changes proposed by the agent are handled. With approval required, runs pause until a project member\n reviews a before/after preview in the Approvals inbox.\n </p>\n <Select\n value={mutationPolicy}\n onValueChange={(value) => {\n setMutationPolicy(value === 'auto_approve' ? 'auto_approve' : 'require_approval');\n }}\n >\n <SelectTrigger aria-label=\"Mutation policy\" className=\"fk:w-fit\" id=\"automation-mutation-policy\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"start\">\n <SelectItem value=\"require_approval\">Require approval (recommended)</SelectItem>\n <SelectItem value=\"auto_approve\">Auto-approve</SelectItem>\n </SelectContent>\n </Select>\n {mutationPolicy === 'auto_approve' && pluginUsages.some((usage) => usage.enabled) ? (\n <p className=\"fk:flex fk:items-start fk:gap-1 fk:text-xs fk:text-warning\" role=\"status\">\n <TriangleAlertIcon className=\"fk:mt-px fk:size-3.5 fk:shrink-0\" />\n Plugin tools will run without review. Content the agent reads, such as emails or documents, could lead it to\n act on your connected accounts.\n </p>\n ) : null}\n {mutationPolicy === 'require_approval' && toolAllowRules && toolAllowRules.length > 0 ? (\n <div className=\"fk:space-y-2\">\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Always allowed plugin tools (approved with “always allow” from the Approvals inbox):\n </p>\n <ul className=\"fk:space-y-1\">\n {toolAllowRules.map((rule) => (\n <li\n className=\"fk:flex fk:items-center fk:justify-between fk:gap-2 fk:rounded-md fk:border fk:border-border fk:px-2.5 fk:py-1.5 fk:text-xs fk:corner-squircle\"\n key={`${rule.pluginId}/${rule.server}/${rule.tool}`}\n >\n <code>\n {rule.pluginId}: {rule.tool}\n </code>\n <Button\n aria-label={`Remove allow rule for ${rule.pluginId} ${rule.tool}`}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setToolAllowRules((current) => (current ?? []).filter((item) => item !== rule))}\n >\n Remove\n </Button>\n </li>\n ))}\n </ul>\n </div>\n ) : 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 fk:corner-squircle\">\n <div className=\"fk:rounded-t-lg fk:corner-squircle\">\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 fk:corner-squircle\">\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 <Separator/>\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 const deliveryPlugin = deliveryPlugins[provider];\n\n return (\n <Fragment key={provider}>\n <div className=\"fk:m-1.5 fk:space-y-2 fk:rounded-md fk:p-1.5 fk:hover:bg-muted fk:corner-squircle\">\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.connected && tool.workspaceName ? (\n <p className=\"fk:text-xs fk:text-muted-foreground\">Connected to {tool.workspaceName}</p>\n ) : null}\n {!tool.connected ? (\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {marketplaceData?.canManage === false\n ? 'Not connected. Ask a project owner or developer to connect it.'\n : 'Not connected'}\n </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={\n !canMutate ||\n !deliveryPlugin?.enabled ||\n !marketplaceData?.canManage ||\n connectingProvider !== null\n }\n size=\"sm\"\n type=\"button\"\n variant=\"outline\"\n onClick={() => void handleConnectDelivery(provider)}\n >\n {connectingProvider === provider ? 'Connecting…' : 'Connect'}\n </Button>\n )}\n </div>\n {tool.connected && tool.enabled ? (\n <div className=\"fk:space-y-2 fk:pl-7\">\n {deliveryPlugin &&\n deliveryPlugin.connections.filter(\n (connection) => connection.scope === 'project' && connection.status === 'connected'\n ).length > 1 ? (\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-3\">\n <Label className=\"fk:text-xs fk:font-medium\">Workspace</Label>\n <PluginAccountSelect\n ariaLabel={`${provider === 'slack' ? 'Slack' : 'Microsoft Teams'} workspace`}\n disabled={!canMutate}\n plugin={deliveryPlugin}\n scopes={['project']}\n value={{ connectionMode: 'project', connectionId: deliveryConnectionIds[provider] }}\n onChange={(choice) => handleDeliveryAccountChange(provider, choice.connectionId)}\n />\n </div>\n ) : null}\n <Label className=\"fk:mr-3 fk:text-xs fk:font-medium\">Channels</Label>\n <ChannelPicker\n channels={tool.availableChannels}\n disabled={tool.loadingChannels || !canMutate}\n loading={tool.loadingChannels}\n provider={provider}\n value={tool.channels}\n onChange={(channels) => updateTool(provider, { channels })}\n onRefresh={() => {\n void loadProviderChannels(provider, resolvedDeliveryConnectionIds[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 <Separator/>\n </Fragment>\n );\n })\n ) : toolsError ? (\n <p className=\"fk:m-1.5 fk:p-1.5 fk:text-xs fk:text-warning\" role=\"alert\">\n Unable to load Slack and Microsoft Teams delivery. Reload the page to try again.\n </p>\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\n <div className=\"fk:m-1.5 fk:space-y-2 fk:rounded-md fk:px-1.25 fk:py-1.5 fk:hover:bg-muted fk:corner-squircle\">\n <div className=\"fk:flex fk:items-center fk:justify-between fk:gap-3\">\n <div className=\"fk:flex fk:gap-2.5\">\n <GraduationCapIcon className=\"fk:mt-px fk:size-5 fk:text-muted-foreground\" />\n <div>\n <div className=\"fk:text-sm fk:font-medium\">Skills</div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Attached skills are always loaded into the agent context. All other skills you can see stay\n discoverable by the agent when relevant.\n </p>\n </div>\n </div>\n <AttachCombobox\n disabled={!canMutate || (attachableSkills.length === 0 && lockedSpaceSkills.length === 0)}\n emptyText=\"No skills match.\"\n items={[\n ...attachableSkills.map((skill) => ({\n id: skill.id,\n label: skill.name,\n attached: skillIds.includes(skill.id),\n badge: skill.source === 'code' ? 'Code' : undefined,\n })),\n ...lockedSpaceSkills.map((skill) => ({\n id: skill.id,\n label: skill.name,\n attached: false,\n badge: skill.source === 'code' ? 'Code' : undefined,\n lockedHint: getLockedSpaceSkillHint(skill, spaceLabelById),\n })),\n ]}\n searchPlaceholder=\"Search skills…\"\n onToggle={toggleSkill}\n />\n </div>\n {skillsData && attachableSkills.length === 0 && lockedSpaceSkills.length === 0 ? (\n <p className=\"fk:pl-7 fk:text-xs fk:text-muted-foreground\">\n No attachable skills yet. Create them on the Skills tab.\n </p>\n ) : null}\n {skillsData?.hasMore ? (\n <p className=\"fk:pl-7 fk:text-xs fk:text-muted-foreground\">\n Showing the {skillsData.skills.length} most recently updated skills. Attached skills outside this list\n are kept when you save.\n </p>\n ) : null}\n {skillIds.length > 0 ? (\n <div className=\"fk:flex fk:flex-wrap fk:gap-1.5 fk:pl-7\">\n {skillIds.map((skillId) => {\n const skill = skillsById[skillId];\n const label = skill?.name ?? 'Loading skill…';\n\n return (\n <Badge className=\"fk:gap-1 fk:pr-1 fk:font-normal\" key={skillId} variant=\"secondary\">\n {label}\n {skill?.source === 'code' ? <span className=\"fk:text-[10px] fk:uppercase\">Code</span> : null}\n <button\n aria-label={skill ? `Detach ${skill.name}` : 'Detach skill'}\n className=\"fk:cursor-pointer fk:rounded-sm fk:text-muted-foreground fk:hover:text-foreground disabled:fk:cursor-not-allowed fk:corner-squircle\"\n disabled={!canMutate}\n type=\"button\"\n onClick={() => toggleSkill(skillId, false)}\n >\n <XIcon className=\"fk:size-3\" />\n </button>\n </Badge>\n );\n })}\n </div>\n ) : null}\n </div>\n <Separator/>\n\n <div className=\"fk:m-1.5 fk:space-y-2 fk:rounded-md fk:px-1.25 fk:py-1.5 fk:hover:bg-muted fk:corner-squircle\">\n <div className=\"fk:flex fk:items-center fk:justify-between fk:gap-3\">\n <div className=\"fk:flex fk:gap-2.5\">\n <WrenchIcon className=\"fk:mt-px fk:size-5 fk:text-muted-foreground\" />\n <div>\n <div className=\"fk:text-sm fk:font-medium\">Custom tools</div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n Attached custom tools can be called during a run. Tools you do not attach stay unavailable to this\n automation.\n </p>\n {customToolsStatus ? (\n <p\n className={\n customToolsCatalog?.connected\n ? 'fk:mt-1 fk:text-xs fk:text-warning'\n : 'fk:mt-1 fk:text-xs fk:text-muted-foreground'\n }\n >\n {customToolsStatus}\n </p>\n ) : null}\n </div>\n </div>\n <AttachCombobox\n disabled={!canMutate || attachableCustomTools.length === 0}\n emptyText=\"No custom tools match.\"\n items={attachableCustomTools.map((tool) => ({\n id: tool.name,\n label: tool.name,\n attached: customToolNames.includes(tool.name),\n }))}\n searchPlaceholder=\"Search custom tools…\"\n onToggle={toggleCustomTool}\n />\n </div>\n {customToolsCatalog && attachableCustomTools.length === 0 ? (\n <p className=\"fk:pl-7 fk:text-xs fk:text-muted-foreground\">\n No custom tools registered yet. Define them in flexkit.tools.ts, run `flexkit dev` or sync them from the Dashboard, then attach the ones this\n automation needs.\n </p>\n ) : null}\n {customToolNames.length > 0 ? (\n <div className=\"fk:flex fk:flex-wrap fk:gap-1.5 fk:pl-7\">\n {customToolNames.map((toolName) => {\n const tool = customToolsByName[toolName];\n const label = tool?.name ?? toolName;\n\n return (\n <Badge className=\"fk:gap-1 fk:pr-1 fk:font-normal\" key={toolName} variant=\"secondary\">\n {label}\n <button\n aria-label={`Detach ${label}`}\n className=\"fk:cursor-pointer fk:rounded-sm fk:text-muted-foreground fk:hover:text-foreground disabled:fk:cursor-not-allowed fk:corner-squircle\"\n disabled={!canMutate}\n type=\"button\"\n onClick={() => toggleCustomTool(toolName, false)}\n >\n <XIcon className=\"fk:size-3\" />\n </button>\n </Badge>\n );\n })}\n </div>\n ) : null}\n </div>\n <Separator/>\n\n <PluginUsagePicker projectId={projectId} value={pluginUsages} disabled={!canMutate} onChange={(usages) => {\n setPluginUsages(usages);\n\n if (usesEnabledPersonalPlugin(usages)) {\n setVisibility('personal');\n setSpaceId(null);\n }\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 <PermissionTooltip disabled={!canMutate}>\n <Button disabled={isSaving || !isValid || !canMutate} type=\"submit\">\n {isSaving ? 'Saving...' : mode === 'create' ? 'Create automation' : 'Update automation'}\n </Button>\n </PermissionTooltip>\n </div>\n </form>\n );\n}\n","import type { JSX, UIEvent } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState, useTransition } from 'react';\nimport { format, formatDistance } from 'date-fns';\nimport {\n ArrowLeft,\n BotIcon,\n CoinsIcon,\n Ellipsis,\n LoaderCircle,\n Pencil,\n Play,\n Plus,\n Trash2,\n TriangleAlertIcon,\n ZapIcon,\n} from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport { getCoreRowModel, useReactTable } from '@tanstack/react-table';\nimport type { ColumnDef, ColumnFiltersState } from '@tanstack/react-table';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Badge,\n Button,\n Conversation,\n ConversationContent,\n ConversationScrollButton,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n ExternalLink,\n PermissionTooltip,\n ScrollArea,\n Separator,\n SidebarTrigger,\n Skeleton,\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 '../../ui';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { createApiClient, fetcher, paths } from './api';\nimport { useRevalidateApprovalsCount } from './approvals-count';\nimport { ApprovalDrawer, ApprovalStatusBadge } from './approval-card';\nimport { AutomationsDataTableToolbar } from './data-table-toolbar';\nimport { AutomationForm } from './form';\nimport {\n MessagePart,\n MutationApprovalPart,\n RunReplayActionsContext,\n STREAM_RETRY_DELAY_MS,\n TurnStatusLine,\n getLiveStatusLabel,\n getMutationApprovalIds,\n isHiddenReplayPart,\n getPendingMutationApprovalIds,\n isTerminalRunStatus,\n messageHasPendingMutationApproval,\n toMutationApprovalPartData,\n useProjectApi,\n useRunStream,\n useSessionMessages,\n type ReplayMessage,\n type RunReplayActions,\n type RunStreamStatus,\n} from './replay';\nimport type {\n Automation,\n AutomationApproval,\n AutomationApprovals,\n AutomationCreditBalance,\n AutomationRun,\n AutomationVisibility,\n ProjectSpace,\n RunHistory,\n} from './types';\n\ninterface AutomationsResponse {\n automations: Automation[];\n count: number;\n hasMore: boolean;\n}\n\nconst AUTOMATIONS_PAGE_SIZE = 25;\n\nfunction getLoadMoreThreshold(clientHeight: number): number {\n return Math.max(600, clientHeight);\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\nfunction isRunHistoryScope(value: string): value is 'mine' | 'team' {\n return value === 'mine' || value === 'team';\n}\n\ninterface CreditResponse {\n creditBalance: AutomationCreditBalance;\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 fk:corner-squircle\">\n {children}\n </div>\n );\n}\n\nfunction getStatusBadgeClass(status: string): string {\n if (status === 'success') {\n return 'fk:bg-success/20 fk:text-success';\n }\n\n if (status === 'awaiting_approval') {\n return 'fk:bg-amber-500/20 fk:text-amber-600';\n }\n\n if (status === 'skipped') {\n return 'fk:bg-orange-500/20 fk:text-orange-700';\n }\n\n return 'fk:bg-secondary fk:text-secondary-foreground';\n}\n\nfunction StatusBadge({ status }: { status: string }): JSX.Element {\n return (\n <Badge\n className={`fk:border-none fk:h-4.75 fk:text-[0.6875rem] fk:leading-4.5 fk:tracking-wide ${getStatusBadgeClass(status)}`}\n variant={status === 'success' ? 'default' : 'secondary'}\n >\n {status === 'awaiting_approval' ? 'awaiting approval' : 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\nfunction getVisibilityLabel(automation: Automation, spaceLabelById: Map<string, string>): string {\n const visibility = automation.visibility ?? 'project';\n\n if (visibility === 'space') {\n return (automation.spaceId ? spaceLabelById.get(automation.spaceId) : undefined) ?? 'Space';\n }\n\n if (visibility === 'personal') {\n return 'Personal';\n }\n\n return 'Project';\n}\n\nconst stickyTableHeaderClassName = 'fk:sticky fk:top-0 fk:z-10 fk:[&_th]:sticky fk:[&_th]:top-0 fk:[&_th]:bg-muted';\n\nfunction AutomationsTableSkeleton(): JSX.Element {\n return (\n <Table>\n <TableHeader className={stickyTableHeaderClassName}>\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>Visibility</TableHead>\n <TableHead className=\"fk:text-center\">Status</TableHead>\n <TableHead />\n </TableRow>\n </TableHeader>\n <TableBody>\n {Array.from({ length: 5 }, (_, index) => (\n <TableRow key={index}>\n <TableCell>\n <Skeleton className=\"fk:h-4 fk:w-36\" />\n </TableCell>\n <TableCell>\n <Skeleton className=\"fk:h-4 fk:w-48\" />\n </TableCell>\n <TableCell>\n <Skeleton className=\"fk:h-4 fk:w-24\" />\n </TableCell>\n <TableCell className=\"fk:text-center\">\n <Skeleton className=\"fk:mx-auto fk:h-4 fk:w-8\" />\n </TableCell>\n <TableCell>\n <Skeleton className=\"fk:h-4.75 fk:w-16\" />\n </TableCell>\n <TableCell className=\"fk:text-center\">\n <Skeleton className=\"fk:mx-auto fk:h-4.75 fk:w-16\" />\n </TableCell>\n <TableCell className=\"fk:text-right\">\n <Skeleton className=\"fk:ml-auto fk:size-8\" />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nfunction columnFilterValues(filters: ColumnFiltersState, columnId: string): string[] {\n const filter = filters.find((entry) => entry.id === columnId);\n const value = filter?.value;\n\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter((entry): entry is string => typeof entry === 'string');\n}\n\nfunction mapStatusFilterToEnabled(values: string[]): boolean[] | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n const enabled = values\n .map((value) => {\n if (value === 'enabled') {\n return true;\n }\n\n if (value === 'disabled') {\n return false;\n }\n\n return null;\n })\n .filter((value): value is boolean => value !== null);\n\n if (enabled.length === 0) {\n return undefined;\n }\n\n return enabled;\n}\n\nfunction mapVisibilityFilter(values: string[]): AutomationVisibility[] | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n const visibility = values.filter(\n (value): value is AutomationVisibility => value === 'project' || value === 'space' || value === 'personal'\n );\n\n if (visibility.length === 0) {\n return undefined;\n }\n\n return visibility;\n}\n\nexport function AutomationsPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const navigate = useNavigate();\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [search, setSearch] = useState('');\n const [message, setMessage] = useState('');\n const canMutate = useCanMutate();\n const scrollRef = useRef<HTMLDivElement>(null);\n const statusFilterValues = columnFilterValues(columnFilters, 'status');\n const visibilityFilterValues = columnFilterValues(columnFilters, 'visibility');\n const enabledFilter = mapStatusFilterToEnabled(statusFilterValues);\n const visibilityFilter = mapVisibilityFilter(visibilityFilterValues);\n const hasActiveFilters = columnFilters.length > 0 || search.trim().length > 0;\n const filterKey = JSON.stringify({ enabledFilter, search, visibilityFilter });\n\n const getAutomationsKey = (pageIndex: number, previousPage: AutomationsResponse | null): string | null => {\n if (!projectId) {\n return null;\n }\n\n if (previousPage && previousPage.hasMore === false) {\n return null;\n }\n\n return paths(projectId).automations({\n enabled: enabledFilter,\n limit: AUTOMATIONS_PAGE_SIZE,\n offset: pageIndex * AUTOMATIONS_PAGE_SIZE,\n search: search.trim() || undefined,\n visibility: visibilityFilter,\n });\n };\n const {\n data: automationPages,\n isLoading,\n mutate,\n setSize,\n size,\n } = useSWRInfinite<AutomationsResponse>(getAutomationsKey, fetcher);\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(projectId ? paths(projectId).spaces : null, fetcher);\n const spaceLabelById = useMemo(\n () => new Map((spacesData?.spaces ?? []).map((space) => [space.id, space.label])),\n [spacesData?.spaces]\n );\n const automations = automationPages?.flatMap((page) => page.automations) ?? [];\n const lastPage = automationPages?.[automationPages.length - 1];\n const hasMore = lastPage?.hasMore ?? false;\n const isLoadingMore = automationPages !== undefined && size > automationPages.length;\n const automationsCount = automationPages?.[0]?.count;\n const isInitialLoading = isLoading && automations.length === 0;\n\n const filterColumns = useMemo<ColumnDef<Automation>[]>(\n () => [\n { id: 'status', accessorKey: 'enabled' },\n { id: 'visibility', accessorKey: 'visibility' },\n ],\n []\n );\n const table = useReactTable({\n columns: filterColumns,\n data: automations,\n getCoreRowModel: getCoreRowModel(),\n manualFiltering: true,\n onColumnFiltersChange: (updater) => {\n void setSize(1);\n setColumnFilters(updater);\n },\n state: { columnFilters },\n });\n\n const onLoadMoreRef = useRef(() => {\n void setSize((currentSize) => currentSize + 1);\n });\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = () => {\n void setSize((currentSize) => currentSize + 1);\n };\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n const { scrollHeight, scrollTop, clientHeight } = scrollElement;\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n if (distanceFromBottom >= getLoadMoreThreshold(clientHeight)) {\n return;\n }\n\n isLoadingMoreRef.current = true;\n onLoadMoreRef.current();\n }, []);\n\n useEffect(() => {\n checkLoadMore();\n }, [checkLoadMore, automations.length, hasMore, isLoadingMore, filterKey]);\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0 });\n }, [filterKey]);\n\n const searchRef = useRef(search);\n searchRef.current = search;\n\n const handleSearchChange = useCallback(\n (nextSearch: string) => {\n if (nextSearch === searchRef.current) {\n return;\n }\n\n void setSize(1);\n setSearch(nextSearch);\n },\n [setSize]\n );\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to view automations.</PageMessage>;\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 function handleScroll(event: UIEvent<HTMLDivElement>): void {\n checkLoadMore(event.currentTarget);\n }\n\n let content: JSX.Element;\n\n if (isLoading && automations.length === 0) {\n content = <AutomationsTableSkeleton />;\n } else if (automations.length === 0) {\n content = <PageMessage>{hasActiveFilters ? 'No results.' : 'No automations yet.'}</PageMessage>;\n } else {\n content = (\n <Table>\n <TableHeader className={stickyTableHeaderClassName}>\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>Visibility</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 <span className=\"fk:font-medium\">{automation.name}</span>\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>\n <Badge\n className=\"fk:h-4.75 fk:text-[0.6875rem] fk:leading-4.5 fk:tracking-wide\"\n variant={automation.visibility === 'personal' ? 'secondary' : 'outline'}\n >\n {getVisibilityLabel(automation, spaceLabelById)}\n </Badge>\n </TableCell>\n <TableCell className=\"fk:text-center\">\n <Badge\n className={`fk:border-none fk:h-4.75 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 disabled={!canMutate}\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 }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-4 fk:pr-4\">\n <div className=\"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:min-w-0 fk:flex-1\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <h1 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">Automations</h1>\n {!isInitialLoading && automationsCount !== undefined ? (\n <span className=\"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground\">\n {automationsCount.toLocaleString()} {automationsCount === 1 ? 'automation' : 'automations'}\n </span>\n ) : null}\n </div>\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>\n\n {message ? <div className=\"fk:text-sm fk:text-destructive\">{message}</div> : null}\n\n <AutomationsDataTableToolbar\n actions={\n <>\n <CreditButton projectId={projectId} />\n {canMutate ? (\n <Button asChild className=\"fk:h-8\" size=\"sm\">\n <Link to=\"new\">\n <Plus className=\"fk:mr-2 fk:size-4\" />\n New Automation\n </Link>\n </Button>\n ) : (\n <PermissionTooltip disabled>\n <Button className=\"fk:h-8\" disabled size=\"sm\">\n <Plus className=\"fk:mr-2 fk:size-4\" />\n New Automation\n </Button>\n </PermissionTooltip>\n )}\n </>\n }\n isSearchLoading={isLoading && search.trim().length > 0}\n search={search}\n table={table}\n onSearchChange={handleSearchChange}\n />\n\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1\">\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-0 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-40\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n <div className=\"fk:h-full fk:overflow-auto\" onScroll={handleScroll} ref={scrollRef}>\n {content}\n </div>\n </div>\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 relative=\"path\" 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\n api={api}\n mode=\"create\"\n projectId={projectId}\n onSaved={() => navigate('..', { relative: 'path' })}\n />\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 canMutate = useCanMutate();\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) && canMutate;\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 fk:pr-4\">\n <Button asChild size=\"sm\" variant=\"ghost\">\n <Link to=\"../automations\">\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 <PermissionTooltip disabled={!canMutate}>\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 </PermissionTooltip>\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, isLoading, mutate, setSize, size } = useSWRInfinite<RunsResponse>(getRunsKey, fetcher);\n const canMutate = useCanMutate();\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) && canMutate;\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 fk:pr-4\">\n <Button asChild size=\"sm\" variant=\"ghost\">\n <Link to=\"../automations\">\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 <PermissionTooltip disabled={!canMutate}>\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 </PermissionTooltip>\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=\".\" isLoading={isLoading} 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 RunsTableSkeleton(): JSX.Element {\n return (\n <Table>\n <TableBody>\n {Array.from({ length: 5 }, (_, index) => (\n <TableRow key={index}>\n <TableCell className=\"fk:py-2\">\n <Skeleton className=\"fk:h-4 fk:w-28\" />\n </TableCell>\n <TableCell>\n <Skeleton className=\"fk:h-4 fk:w-20\" />\n </TableCell>\n <TableCell>\n <Skeleton className=\"fk:h-4.75 fk:w-16\" />\n </TableCell>\n <TableCell>\n <Skeleton className=\"fk:h-4 fk:w-full fk:max-w-md\" />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n );\n}\n\nfunction RunsTable({\n basePath,\n isLoading = false,\n runs,\n}: {\n basePath: string;\n isLoading?: boolean;\n runs: AutomationRun[];\n}): JSX.Element {\n if (isLoading) {\n return <RunsTableSkeleton />;\n }\n\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, isLoading, 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 function handleScopeChange(nextScope: string): void {\n if (!isRunHistoryScope(nextScope) || nextScope === scope) {\n return;\n }\n\n setScope(nextScope);\n }\n\n let metricsContent: JSX.Element | null = null;\n\n if (isLoading) {\n metricsContent = (\n <div className=\"fk:mb-6 fk:grid fk:shrink-0 fk:gap-3 fk:grid-cols-4 fk:pr-4\">\n {Array.from({ length: 4 }, (_, index) => (\n <div className=\"fk:rounded-md fk:bg-muted/60 fk:p-4 fk:corner-squircle\" key={index}>\n <Skeleton className=\"fk:h-4 fk:w-24\" />\n <Skeleton className=\"fk:mt-2 fk:h-8 fk:w-12\" />\n </div>\n ))}\n </div>\n );\n } else if (metrics) {\n metricsContent = (\n <div className=\"fk:mb-6 fk:grid fk:shrink-0 fk:gap-3 fk:grid-cols-4 fk:pr-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 );\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col\">\n <div className=\"fk:mb-2 fk:flex fk:shrink-0 fk:items-center 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 <Tabs value={scope} onValueChange={handleScopeChange}>\n <TabsList>\n <TabsTrigger value=\"team\">Team</TabsTrigger>\n <TabsTrigger value=\"mine\">Mine</TabsTrigger>\n </TabsList>\n </Tabs>\n </div>\n {metricsContent}\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=\"../automations\"\n isLoading={isLoading}\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\nconst APPROVALS_PAGE_SIZE = 25;\n\nfunction isApprovalStatusFilter(value: string): value is 'pending' | 'all' {\n return value === 'pending' || value === 'all';\n}\n\nexport function ApprovalsPage(): JSX.Element {\n const { api, projectId } = useProjectApi();\n const [statusFilter, setStatusFilter] = useState<'pending' | 'all'>('pending');\n const [selectedApprovalId, setSelectedApprovalId] = useState<string | null>(null);\n const getApprovalsKey = (pageIndex: number, previousPage: AutomationApprovals | null): string | null => {\n if (!projectId) {\n return null;\n }\n\n if (previousPage && !previousPage.hasMore) {\n return null;\n }\n\n return paths(projectId).approvals({\n limit: APPROVALS_PAGE_SIZE,\n offset: pageIndex * APPROVALS_PAGE_SIZE,\n status: statusFilter === 'pending' ? 'pending' : undefined,\n });\n };\n const {\n data: approvalPages,\n isLoading,\n mutate,\n setSize,\n size,\n } = useSWRInfinite<AutomationApprovals>(getApprovalsKey, fetcher, { refreshInterval: 30_000 });\n const approvals = approvalPages?.flatMap((page) => page.approvals) ?? [];\n const pendingCount = approvalPages?.[0]?.pendingCount ?? 0;\n const firstPage = approvalPages?.[0];\n const revalidateApprovalsCount = useRevalidateApprovalsCount();\n\n // The inbox response carries the pending count; keep the sidebar badge in step with it.\n useEffect(() => {\n if (firstPage) {\n revalidateApprovalsCount(firstPage);\n }\n }, [firstPage, revalidateApprovalsCount]);\n const lastPage = approvalPages?.[approvalPages.length - 1];\n const hasMore = lastPage?.hasMore ?? false;\n const isLoadingMore = approvalPages !== undefined && size > approvalPages.length;\n const selectedApproval = approvals.find((approval) => approval.id === selectedApprovalId) ?? null;\n\n // Deciding while on Pending removes the row, so selectedApproval becomes null and\n // the drawer closes — but selectedApprovalId would still be set. Clear it once the\n // current filter's data has loaded without that id, otherwise switching to All\n // would reopen the drawer without a click.\n useEffect(() => {\n if (selectedApprovalId === null || selectedApproval !== null || isLoading || approvalPages === undefined) {\n return;\n }\n\n setSelectedApprovalId(null);\n }, [approvalPages, isLoading, selectedApproval, selectedApprovalId]);\n\n if (!projectId || !api) {\n return <PageMessage>Select a project to view approvals.</PageMessage>;\n }\n\n function handleLoadMore(): void {\n void setSize((currentSize) => currentSize + 1);\n }\n\n function handleStatusFilterChange(nextFilter: string): void {\n if (!isApprovalStatusFilter(nextFilter) || nextFilter === statusFilter) {\n return;\n }\n\n // useSWRInfinite keeps `size` across key changes. Reset so the new filter\n // only fetches page 0 instead of replaying every previously loaded page.\n void setSize(1);\n setStatusFilter(nextFilter);\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:flex-col\">\n <div className=\"fk:mb-2 fk:flex fk:shrink-0 fk:items-center 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 <Tabs value={statusFilter} onValueChange={handleStatusFilterChange}>\n <TabsList>\n <TabsTrigger value=\"pending\">\n Pending{pendingCount > 0 ? ` (${pendingCount.toString()})` : ''}\n </TabsTrigger>\n <TabsTrigger value=\"all\">All</TabsTrigger>\n </TabsList>\n </Tabs>\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 {isLoading ? (\n <RunsTableSkeleton />\n ) : approvals.length === 0 ? (\n <PageMessage>\n {statusFilter === 'pending' ? 'No proposals are waiting for approval.' : 'No approvals found.'}\n </PageMessage>\n ) : (\n <Table>\n <TableBody>\n {approvals.map((approval) => (\n <TableRow\n className=\"fk:cursor-pointer\"\n key={approval.id}\n onClick={() => setSelectedApprovalId(approval.id)}\n >\n <TableCell>\n <ApprovalStatusBadge status={approval.status} />\n </TableCell>\n <TableCell className=\"fk:font-medium\">{approval.operationsSummary}</TableCell>\n <TableCell className=\"fk:text-muted-foreground\">{approval.automationName}</TableCell>\n <TableCell className=\"fk:text-muted-foreground\">\n {formatDistance(new Date(approval.requestedAt), new Date(), { addSuffix: true })}\n </TableCell>\n <TableCell onClick={(event) => event.stopPropagation()}>\n {approval.chatId ? (\n <Link\n className=\"fk:text-xs fk:text-muted-foreground hover:fk:underline\"\n to={`../agent/chats/${approval.chatId}`}\n >\n View chat\n </Link>\n ) : approval.automationId && approval.runId ? (\n <Link\n className=\"fk:text-xs fk:text-muted-foreground hover:fk:underline\"\n to={`../automations/${approval.automationId}/runs/${approval.runId}`}\n >\n View run\n </Link>\n ) : null}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\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 approvals...</span>\n </div>\n ) : null}\n </div>\n </ScrollArea>\n {selectedApproval ? (\n <ApprovalDrawer\n api={api}\n approval={selectedApproval}\n key={`${selectedApproval.id}-${selectedApproval.status}`}\n onClose={() => setSelectedApprovalId(null)}\n onDecided={() => void mutate()}\n />\n ) : null}\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 fk:corner-squircle\">\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\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 refreshInterval: (latestData) => {\n if (!latestData?.run || isTerminalRunStatus(latestData.run.status)) {\n return 0;\n }\n\n return STREAM_RETRY_DELAY_MS;\n },\n });\n const { data: automationData } = useSWR<AutomationResponse>(\n projectId && automationId ? paths(projectId).automation(automationId) : null,\n fetcher\n );\n const [isCancelling, startCancelTransition] = useTransition();\n const [streamFinished, setStreamFinished] = useState(false);\n\n useEffect(() => {\n setStreamFinished(false);\n }, [runId]);\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 // Once a run is awaiting approval, rejecting the proposal is the way to stop\n // it, so Cancel only shows for in-flight running runs.\n const showCancel = run?.status === 'running' && !streamFinished;\n\n function handleCancel(): void {\n startCancelTransition(async () => {\n await runApi.cancelRun(selectedRunId);\n await mutate();\n });\n }\n\n function handleStreamFinished(): void {\n setStreamFinished(true);\n void mutate();\n }\n\n function handleRunUpdated(): void {\n void mutate();\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 fk:pr-4\">\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 <div className=\"fk:mt-4 fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <h2 className=\"fk:text-sm fk:font-medium\">\n {run ? `Run from ${format(new Date(run.startedAt), 'PPpp')}` : 'Loading run...'}\n </h2>\n {run ? <StatusBadge status={run.status} /> : null}\n </div>\n </div>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n {run && isTerminalRunStatus(run.status) ? (\n <Button asChild size=\"sm\" variant=\"outline\">\n <a href={runApi.getTranscriptUrl(selectedRunId)} rel=\"noreferrer\" target=\"_blank\">\n Transcript\n </a>\n </Button>\n ) : null}\n {showCancel ? (\n <Button disabled={isCancelling} size=\"sm\" variant=\"destructive\" onClick={handleCancel}>\n {isCancelling ? 'Cancelling...' : 'Cancel run'}\n </Button>\n ) : null}\n </div>\n </div>\n <Conversation className=\"fk:h-0 fk:min-h-0 fk:flex-1\">\n <ConversationContent className=\"fk:gap-0 fk:p-0\">\n <div className=\"fk:mx-auto fk:w-full fk:max-w-5xl fk:pb-6 fk:pr-4\">\n {run ? (\n <RunReplay api={api} run={run} onRunUpdated={handleRunUpdated} onStreamFinished={handleStreamFinished} />\n ) : (\n <PageMessage>Loading run...</PageMessage>\n )}\n </div>\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n </div>\n );\n}\n\nfunction getRunReplayEmptyLabel(status: RunStreamStatus): string {\n if (status === 'unavailable') {\n return 'No replay events were recorded.';\n }\n\n if (status === 'error') {\n return 'Unable to load run replay.';\n }\n\n return 'Loading run replay...';\n}\n\nfunction RunReplay({\n api,\n onRunUpdated,\n onStreamFinished,\n run,\n}: {\n api: ReturnType<typeof createApiClient>;\n onRunUpdated?: () => void;\n onStreamFinished?: () => void;\n run: AutomationRun;\n}): JSX.Element {\n const { projectId } = useProjectApi();\n const { workflowRunId } = run;\n const streamApi = workflowRunId ? api.getStreamUrl(workflowRunId) : '';\n // Increments to force a stream reconnect after a decide; not used as the\n // pause-suppress flag (that would stick for the rest of the run).\n const [resumeToken, setResumeToken] = useState(0);\n const [suppressApprovalPause, setSuppressApprovalPause] = useState(false);\n // Retain fallback cards across the post-decide suppress window. Local\n // approve/reject sets suppressApprovalPause, which clears isAwaitingApproval\n // and the pending SWR key — without a sticky list the card unmounts and an\n // empty stream falls back to the loading state until reconnect writes a\n // data-mutation-approval part.\n const [stickyFallbackApprovals, setStickyFallbackApprovals] = useState<AutomationApproval[]>([]);\n const lastDecidedApprovalIdRef = useRef<string | null>(null);\n const { message, status } = useRunStream(streamApi, {\n recordStatus: run.status,\n resumeToken,\n suppressApprovalPause,\n });\n const rawMessages = useMemo(() => (message ? [message] : []), [message]);\n const messages = useSessionMessages(rawMessages);\n const onRunUpdatedRef = useRef(onRunUpdated);\n onRunUpdatedRef.current = onRunUpdated;\n const onStreamFinishedRef = useRef(onStreamFinished);\n onStreamFinishedRef.current = onStreamFinished;\n const replayActions = useMemo<RunReplayActions>(\n () => ({\n onApprovalDecided: (approvalId) => {\n // The reconnect below remounts the approval card, which may re-report\n // the same decision; reconnecting again would loop forever.\n if (approvalId && lastDecidedApprovalIdRef.current === approvalId) {\n return;\n }\n\n if (approvalId) {\n lastDecidedApprovalIdRef.current = approvalId;\n }\n\n setSuppressApprovalPause(true);\n setResumeToken((current) => current + 1);\n onRunUpdatedRef.current?.();\n },\n }),\n []\n );\n // Prefer the run record over a stale pending stream part once the workflow\n // has resumed (`running`) or finished.\n const isAwaitingApproval =\n !suppressApprovalPause &&\n run.status !== 'running' &&\n !isTerminalRunStatus(run.status) &&\n (status === 'paused' || run.status === 'awaiting_approval' || messageHasPendingMutationApproval(message));\n const revalidateApprovalsCount = useRevalidateApprovalsCount();\n const runEnded = isTerminalRunStatus(run.status);\n\n // The sidebar badge learns about a new proposal, or a run that ended with\n // its proposals cancelled, as soon as this page does.\n useEffect(() => {\n if (isAwaitingApproval || runEnded) {\n revalidateApprovalsCount();\n }\n }, [isAwaitingApproval, revalidateApprovalsCount, runEnded]);\n // When the durable stream has no pending data-mutation-approval part\n // (empty replay, or earlier tool/text parts only), MutationApprovalPart\n // never mounts — load pending proposals for this run as a fallback.\n // Query by runId so the proposal is found even when it is not among the\n // first page of project-wide pending approvals.\n const streamHasPendingApproval = messageHasPendingMutationApproval(message);\n const shouldLoadApprovalFallback = isAwaitingApproval && !streamHasPendingApproval && projectId != null;\n const { data: pendingApprovalsData } = useSWR<AutomationApprovals>(\n shouldLoadApprovalFallback && projectId\n ? paths(projectId).approvals({ limit: 25, offset: 0, runId: run.id, status: 'pending' })\n : null,\n fetcher,\n { refreshInterval: STREAM_RETRY_DELAY_MS }\n );\n // Skip rows the stream already renders — including decided parts — so a\n // refreshed/approved stream event and a still-pending list response do not\n // produce two cards for the same proposal.\n const streamApprovalIds = useMemo(() => new Set(getMutationApprovalIds(message)), [message]);\n const fallbackApprovals = stickyFallbackApprovals.filter((approval) => !streamApprovalIds.has(approval.id));\n const isRunActive = !isTerminalRunStatus(run.status);\n const streamIsOpen = isRunActive && (status === 'streaming' || status === 'paused');\n // An open stream counts as content so the container (and its status line)\n // exists before the first part arrives, instead of swapping the empty-state\n // box for the content box mid-run.\n const hasReplayContent = messages.length > 0 || fallbackApprovals.length > 0 || streamIsOpen;\n\n useEffect(() => {\n setResumeToken(0);\n setSuppressApprovalPause(false);\n lastDecidedApprovalIdRef.current = null;\n setStickyFallbackApprovals([]);\n }, [run.id]);\n\n useEffect(() => {\n const approvals = pendingApprovalsData?.approvals;\n\n if (!approvals?.length) {\n return;\n }\n\n setStickyFallbackApprovals((current) => {\n const byId = new Map(current.map((approval) => [approval.id, approval]));\n\n for (const approval of approvals) {\n byId.set(approval.id, approval);\n }\n\n return [...byId.values()];\n });\n }, [pendingApprovalsData]);\n\n useEffect(() => {\n setStickyFallbackApprovals((current) => {\n if (current.length === 0) {\n return current;\n }\n\n const next = current.filter((approval) => !streamApprovalIds.has(approval.id));\n\n return next.length === current.length ? current : next;\n });\n }, [streamApprovalIds]);\n\n // Clear the post-decide suppress window once the workflow has resumed, or\n // when a later pending approval appears in the same run (we may have missed\n // an intermediate `running` status between polls).\n useEffect(() => {\n if (!suppressApprovalPause) {\n return;\n }\n\n if (run.status === 'running') {\n setSuppressApprovalPause(false);\n\n return;\n }\n\n if (run.status !== 'awaiting_approval') {\n return;\n }\n\n const pendingIds = getPendingMutationApprovalIds(message);\n const decidedId = lastDecidedApprovalIdRef.current;\n\n if (pendingIds.length === 0 || decidedId === null) {\n return;\n }\n\n if (pendingIds.every((approvalId) => approvalId !== decidedId)) {\n setSuppressApprovalPause(false);\n }\n }, [message, run.status, suppressApprovalPause]);\n\n useEffect(() => {\n if (status !== 'finished') {\n return;\n }\n\n onStreamFinishedRef.current?.();\n }, [status]);\n\n useEffect(() => {\n if (status !== 'paused') {\n return;\n }\n\n onRunUpdatedRef.current?.();\n }, [status]);\n\n // Poll while suspended on approval so a decision made elsewhere (Approvals\n // inbox, another tab) updates this view. Local approve/reject also bumps\n // resumeToken to reconnect the stream immediately; the run status only flips\n // back to `running` once the suspended workflow step resumes.\n useEffect(() => {\n if (run.status !== 'awaiting_approval') {\n return;\n }\n\n const intervalId = window.setInterval(() => {\n onRunUpdatedRef.current?.();\n }, STREAM_RETRY_DELAY_MS);\n\n return () => {\n window.clearInterval(intervalId);\n };\n }, [run.status]);\n\n if (!workflowRunId) {\n return <PageMessage>The run has not started streaming yet.</PageMessage>;\n }\n\n const awaitingDecision = isAwaitingApproval && status !== 'finished' && status !== 'error';\n // A run that died without closing its stream keeps the reader in\n // `streaming` forever; the run record is authoritative once it reaches a\n // terminal status, which is why the line is gated on `isRunActive`.\n const showStatusLine = streamIsOpen || awaitingDecision;\n const lastPart = message?.parts[message.parts.length - 1];\n const contentIsStreaming = lastPart?.type === 'text' && lastPart.state === 'streaming';\n const statusLabel = isAwaitingApproval ? 'Awaiting approval' : (getLiveStatusLabel(message) ?? 'Thinking');\n const statusVisible = isAwaitingApproval || !contentIsStreaming;\n const emptyLabel = getRunReplayEmptyLabel(status);\n\n return (\n <RunReplayActionsContext.Provider value={replayActions}>\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 fk:corner-squircle\">\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 fk:corner-squircle\">\n The workflow replay is no longer available. Generated artifacts may still be available below.\n </div>\n ) : null}\n {status === 'error' && !hasReplayContent ? (\n <div className=\"fk:rounded-md fk:border fk:border-destructive/30 fk:bg-destructive/5 fk:p-4 fk:text-sm fk:corner-squircle\">\n Failed to load the run stream. Try reloading the page.\n </div>\n ) : null}\n {hasReplayContent ? (\n <div className=\"fk:space-y-5 fk:rounded-md fk:bg-background fk:corner-squircle\">\n {messages.map((replayMessage) => (\n <ReplayMessageView key={replayMessage.id} api={api} message={replayMessage} />\n ))}\n {fallbackApprovals.map((approval) => (\n <MutationApprovalPart api={api} key={approval.id} message={toMutationApprovalPartData(approval)} />\n ))}\n {showStatusLine ? <TurnStatusLine label={statusLabel} visible={statusVisible} /> : 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 fk:corner-squircle\">\n {status === 'unavailable' || status === 'error' ? (\n <TriangleAlertIcon className=\"fk:size-4\" />\n ) : (\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n )}\n <span>{emptyLabel}</span>\n </div>\n )}\n </div>\n </RunReplayActionsContext.Provider>\n );\n}\n\nfunction ReplayMessageView({\n api,\n message,\n}: {\n api: ReturnType<typeof createApiClient>;\n message: ReplayMessage;\n}): JSX.Element | null {\n const isUser = message.role === 'user';\n // Reasoning, in-flight tool calls, and Jev-cleared plugin calls only feed\n // the transient status line; the replay shows what the agent produced.\n const parts = message.parts.filter((part) => !isHiddenReplayPart(part));\n\n if (parts.length === 0) {\n return null;\n }\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-8 fk:min-w-0\">\n {parts.map((part, index) => (\n <MessagePart api={api} key={index} part={part} partIndex={index} parts={parts} />\n ))}\n </div>\n </div>\n );\n}\n"]}
|