chore: linting

This commit is contained in:
DESKTOP-RTLN3BA\$punk 2026-06-09 00:42:26 -07:00
parent 0a012dbc79
commit ce952d2ad1
127 changed files with 821 additions and 517 deletions

View file

@ -89,13 +89,7 @@ export function AutomationDefinitionSection({ definition }: AutomationDefinition
);
}
function Field({
label,
children,
}: {
label: React.ReactNode;
children: React.ReactNode;
}) {
function Field({ label, children }: { label: React.ReactNode; children: React.ReactNode }) {
return (
<div className="space-y-2">
<div className="text-sm font-medium text-muted-foreground">{label}</div>

View file

@ -101,12 +101,21 @@ export function AutomationDetailHeader({
disabled={updating}
className="relative justify-start rounded-md bg-muted px-3 hover:bg-accent"
>
<span className={updating ? "inline-flex items-center whitespace-nowrap opacity-0" : "inline-flex items-center whitespace-nowrap"}>
<span
className={
updating
? "inline-flex items-center whitespace-nowrap opacity-0"
: "inline-flex items-center whitespace-nowrap"
}
>
<PauseIcon className="mr-1 h-4 w-4" />
{pauseLabel}
</span>
{updating && (
<Spinner size="xs" className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2" />
<Spinner
size="xs"
className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
/>
)}
</Button>
)}

View file

@ -26,9 +26,7 @@ export function AutomationTriggersSection({
<Card className="border-border/60 bg-accent">
<CardHeader className="pb-4">
<CardTitle className="text-base font-semibold">Triggers</CardTitle>
<p className="text-xs text-muted-foreground">
When this automation runs
</p>
<p className="text-xs text-muted-foreground">When this automation runs</p>
</CardHeader>
<CardContent>
{triggers.length === 0 ? (

View file

@ -77,8 +77,10 @@ function getStepDetails(step: PlanStep): { label: string; value: string }[] {
if (step.when) details.push({ label: "Runs when", value: step.when });
if (step.output_as) details.push({ label: "Saves output as", value: step.output_as });
if (step.max_retries != null) details.push({ label: "Max retries", value: String(step.max_retries) });
if (step.timeout_seconds != null) details.push({ label: "Timeout", value: `${step.timeout_seconds}s` });
if (step.max_retries != null)
details.push({ label: "Max retries", value: String(step.max_retries) });
if (step.timeout_seconds != null)
details.push({ label: "Timeout", value: `${step.timeout_seconds}s` });
return details;
}

View file

@ -23,13 +23,13 @@ import { Spinner } from "@/components/ui/spinner";
import { Switch } from "@/components/ui/switch";
import { type Trigger, triggerUpdateRequest } from "@/contracts/types/automation.types";
import { describeCron } from "@/lib/automations/describe-cron";
import { formatRelativeFutureDate } from "@/lib/format-date";
import {
DEFAULT_SCHEDULE,
fromCron,
type ScheduleFrequency,
toCron,
} from "@/lib/automations/schedule-builder";
import { formatRelativeFutureDate } from "@/lib/format-date";
import { TimezoneCombobox } from "../../components/builder/timezone-combobox";
import { DeleteTriggerDialog } from "./delete-trigger-dialog";
@ -277,7 +277,10 @@ export function TriggerCard({ trigger, automationId, canUpdate, canDelete }: Tri
</div>
) : draft.frequency !== "custom" ? (
<div className="space-y-1.5">
<label className="text-xs font-medium text-muted-foreground" htmlFor="trigger-time">
<label
className="text-xs font-medium text-muted-foreground"
htmlFor="trigger-time"
>
Time
</label>
<Input
@ -296,7 +299,10 @@ export function TriggerCard({ trigger, automationId, canUpdate, canDelete }: Tri
</div>
) : (
<div className="space-y-1.5">
<label className="text-xs font-medium text-muted-foreground" htmlFor="trigger-cron">
<label
className="text-xs font-medium text-muted-foreground"
htmlFor="trigger-cron"
>
Schedule expression
</label>
<Input

View file

@ -8,19 +8,14 @@ interface AutomationStatusBadgeProps {
}
// Small borderless status pills, matching model-selector badges.
const STATUS_STYLES: Record<
AutomationStatus,
{ label: string; classes: string }
> = {
const STATUS_STYLES: Record<AutomationStatus, { label: string; classes: string }> = {
active: {
label: "Active",
classes:
"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/50 dark:text-emerald-300",
classes: "bg-emerald-100 text-emerald-700 dark:bg-emerald-900/50 dark:text-emerald-300",
},
paused: {
label: "Paused",
classes:
"bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300",
classes: "bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300",
},
archived: {
label: "Archived",

View file

@ -65,13 +65,7 @@ export function BuilderSummary({ form }: BuilderSummaryProps) {
);
}
function SummaryRow({
label,
children,
}: {
label: string;
children: React.ReactNode;
}) {
function SummaryRow({ label, children }: { label: string; children: React.ReactNode }) {
return (
<div className="flex flex-col gap-1 text-xs">
<div className="font-medium text-muted-foreground">{label}</div>

View file

@ -1,11 +1,7 @@
"use client";
import * as AccordionPrimitive from "@radix-ui/react-accordion";
import { ChevronDown, ChevronRight, ChevronUp, Trash2 } from "lucide-react";
import {
Accordion,
AccordionContent,
AccordionItem,
} from "@/components/ui/accordion";
import { Accordion, AccordionContent, AccordionItem } from "@/components/ui/accordion";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import type { BuilderTask } from "@/lib/automations/builder-schema";
@ -105,7 +101,7 @@ export function TaskItem({
<AccordionItem value="advanced" className="border-b-0">
<AccordionPrimitive.Header className="flex">
<AccordionPrimitive.Trigger className="group flex flex-1 items-center justify-between rounded-md py-1.5 text-left text-xs font-medium text-muted-foreground outline-none transition-all focus-visible:ring-[3px] focus-visible:ring-ring/50">
Advanced
Advanced
<ChevronRight className="pointer-events-none size-4 shrink-0 transition-transform duration-200 group-data-[state=open]:rotate-90" />
</AccordionPrimitive.Trigger>
</AccordionPrimitive.Header>

View file

@ -51,11 +51,7 @@ export function TaskList({ tasks, errors, searchSpaceId, onChange }: TaskListPro
{errors.tasks && <p className="text-xs text-destructive">{errors.tasks}</p>}
<Button
type="button"
size="sm"
onClick={() => onChange([...tasks, emptyTask()])}
>
<Button type="button" size="sm" onClick={() => onChange([...tasks, emptyTask()])}>
<Plus className="h-4 w-4" />
Add task
</Button>

View file

@ -32,7 +32,9 @@ export function AutomationNewHeader({ searchSpaceId, modeSwitcher }: AutomationN
Configure the task, schedule, and execution settings for this automation.
</p>
</div>
{modeSwitcher ? <div className="ml-auto hidden shrink-0 md:block">{modeSwitcher}</div> : null}
{modeSwitcher ? (
<div className="ml-auto hidden shrink-0 md:block">{modeSwitcher}</div>
) : null}
</div>
</div>
);

View file

@ -3,4 +3,3 @@ import { MessagingChannelsContent } from "../components/MessagingChannelsContent
export default function Page() {
return <MessagingChannelsContent />;
}

View file

@ -35,9 +35,7 @@ export const MCPTrustedTools: FC<MCPTrustedToolsProps> = ({ connector }) => {
return (
<div className="space-y-4">
<h3 className="font-medium text-sm sm:text-base flex items-center gap-2">
Trusted Tools
</h3>
<h3 className="font-medium text-sm sm:text-base flex items-center gap-2">Trusted Tools</h3>
<div className="rounded-xl border border-border bg-slate-400/5 dark:bg-white/5 p-3 sm:p-6 space-y-4">
<p className="text-[10px] sm:text-xs text-muted-foreground">

View file

@ -278,7 +278,10 @@ export const ConnectorEditView: FC<ConnectorEditViewProps> = ({
{/* Vision toggle (Obsidian is plugin-push, non-indexable by design) */}
{showsVisionToggle && (
<VisionLLMConfig enabled={enableVisionLlm} onEnabledChange={onEnableVisionLlmChange} />
<VisionLLMConfig
enabled={enableVisionLlm}
onEnabledChange={onEnableVisionLlmChange}
/>
)}
{/* Date-range and periodic sync stay indexable-only */}
@ -310,11 +313,13 @@ export const ConnectorEditView: FC<ConnectorEditViewProps> = ({
connector.connector_type === "COMPOSIO_GOOGLE_DRIVE_CONNECTOR";
const requiresFolderSelection = isGoogleDrive || isComposioGoogleDrive;
const selectedFolders =
(connector.config?.selected_folders as Array<{ id: string; name: string }> | undefined) ||
[];
(connector.config?.selected_folders as
| Array<{ id: string; name: string }>
| undefined) || [];
const selectedFiles =
(connector.config?.selected_files as Array<{ id: string; name: string }> | undefined) ||
[];
(connector.config?.selected_files as
| Array<{ id: string; name: string }>
| undefined) || [];
const hasItemsSelected = selectedFolders.length > 0 || selectedFiles.length > 0;
const isDisabled = requiresFolderSelection && !hasItemsSelected;

View file

@ -177,7 +177,10 @@ export const IndexingConfigurationView: FC<IndexingConfigurationViewProps> = ({
{/* Vision toggle (Obsidian is plugin-push, non-indexable by design) */}
{showsVisionToggle && (
<VisionLLMConfig enabled={enableVisionLlm} onEnabledChange={onEnableVisionLlmChange} />
<VisionLLMConfig
enabled={enableVisionLlm}
onEnabledChange={onEnableVisionLlmChange}
/>
)}
{/* Date-range and periodic sync stay indexable-only */}

View file

@ -654,7 +654,7 @@ export const useConnectorDialog = () => {
setConnectorConfig(connector.config || {});
setPeriodicEnabled(false);
setFrequencyMinutes("1440");
setEnableVisionLlm(connector.enable_vision_llm ?? false);
setEnableVisionLlm(connector.enable_vision_llm ?? false);
setStartDate(undefined);
setEndDate(undefined);
@ -808,7 +808,7 @@ export const useConnectorDialog = () => {
await updateConnector({
id: indexingConfig.connectorId,
data: {
enable_vision_llm: enableVisionLlm,
enable_vision_llm: enableVisionLlm,
...(periodicEnabled && {
periodic_indexing_enabled: true,
indexing_frequency_minutes: frequency,

View file

@ -2,9 +2,9 @@
import {
FilePlus2,
type LucideIcon,
Search,
Settings2,
type LucideIcon,
WandSparkles,
Workflow,
X,
@ -55,7 +55,31 @@ export function ChatExamplePrompts({ onSelect }: ChatExamplePromptsProps) {
return (
<div className="mt-2 w-full select-none sm:mt-3">
{activeCategory ? null : (
{activeCategory ? (
<div>
<div className="flex items-center gap-2 px-0.5 pb-2">
<Button
type="button"
variant="secondary"
onClick={() => setActiveCategoryId(null)}
className="h-8 rounded-lg bg-muted px-3 text-xs font-medium text-muted-foreground shadow-sm shadow-black/5 hover:bg-foreground/10 hover:text-foreground dark:shadow-black/10 sm:h-10 sm:rounded-xl sm:px-4 sm:text-sm"
>
<X aria-hidden="true" className="size-3.5 sm:size-4" />
Back
</Button>
<span className="text-sm font-medium text-foreground">{activeCategory.label}</span>
</div>
<ScrollArea className="h-[clamp(7.5rem,26vh,12rem)]">
<ul className="flex flex-col gap-2 pr-3">
{activeCategory.prompts.map((prompt) => (
<li key={prompt}>
<ExamplePromptButton prompt={prompt} onSelect={onSelect} />
</li>
))}
</ul>
</ScrollArea>
</div>
) : (
<div className="pb-1">
<div className="mx-auto flex max-w-full flex-wrap items-center justify-center gap-1.5 px-0.5 sm:gap-2">
{CHAT_EXAMPLE_CATEGORIES.map((category) => {
@ -76,24 +100,7 @@ export function ChatExamplePrompts({ onSelect }: ChatExamplePromptsProps) {
})}
</div>
</div>
{CHAT_EXAMPLE_CATEGORIES.map((category) => (
<TabsContent
key={category.id}
value={category.id}
className="mt-3 focus-visible:outline-none"
>
<ScrollArea className="h-[clamp(7.5rem,26vh,12rem)]">
<ul className="flex flex-col gap-2 pr-3">
{category.prompts.map((prompt) => (
<li key={prompt}>
<ExamplePromptButton prompt={prompt} onSelect={onSelect} />
</li>
))}
</ul>
</ScrollArea>
</TabsContent>
))}
</Tabs>
)}
</div>
);
}
}

View file

@ -138,7 +138,7 @@ export function LLMRoleManager({ searchSpaceId }: LLMRoleManagerProps) {
useEffect(() => {
setAssignments({
agent_llm_id: preferences.agent_llm_id ?? null,
image_generation_config_id: preferences.image_generation_config_id ?? null,
image_generation_config_id: preferences.image_generation_config_id ?? null,
vision_llm_config_id: preferences.vision_llm_config_id ?? null,
});
}, [

View file

@ -693,7 +693,6 @@ export function DocumentUploadTab({
</div>
)}
<div className={toggleRowClass}>
<div className="space-y-0.5">
<p className="font-medium text-sm">Enable Vision LLM</p>

View file

@ -119,19 +119,13 @@ export function FolderWatchDialog({
setSubmitting(false);
setProgress(null);
}
}, [
selectedFolder,
searchSpaceId,
supportedExtensions,
onOpenChange,
onSuccess,
]);
}, [selectedFolder, searchSpaceId, supportedExtensions, onOpenChange, onSuccess]);
const handleOpenChange = useCallback(
(nextOpen: boolean) => {
if (!nextOpen && !submitting) {
setSelectedFolder(null);
setProgress(null);
setProgress(null);
}
onOpenChange(nextOpen);
},
@ -200,7 +194,6 @@ export function FolderWatchDialog({
{selectedFolder && (
<>
{progressLabel && (
<div className="rounded-lg bg-slate-400/5 dark:bg-white/5 px-3 py-2">
<p className="text-xs text-muted-foreground">{progressLabel}</p>

View file

@ -1,13 +1,6 @@
{
"title": "Messaging Channels",
"icon": "MessageCircle",
"pages": [
"telegram",
"whatsapp",
"slack",
"discord",
"docker",
"troubleshooting"
],
"pages": ["telegram", "whatsapp", "slack", "discord", "docker", "troubleshooting"],
"defaultOpen": false
}

View file

@ -3,6 +3,7 @@ import {
createDocumentRequest,
createDocumentResponse,
type DeleteDocumentRequest,
type DocumentFileRead,
deleteDocumentRequest,
deleteDocumentResponse,
documentTitleRead,
@ -16,6 +17,7 @@ import {
getDocumentByChunkResponse,
getDocumentChunksRequest,
getDocumentChunksResponse,
getDocumentFilesResponse,
getDocumentRequest,
getDocumentResponse,
getDocumentsRequest,
@ -30,8 +32,6 @@ import {
searchDocumentsResponse,
searchDocumentTitlesRequest,
searchDocumentTitlesResponse,
type DocumentFileRead,
getDocumentFilesResponse,
type UpdateDocumentRequest,
type UploadDocumentRequest,
updateDocumentRequest,

View file

@ -61,7 +61,7 @@ async function uploadBatchesWithConcurrency(
folderName: string;
searchSpaceId: number;
rootFolderId: number | null;
processingMode?: "basic" | "premium";
processingMode?: "basic" | "premium";
signal?: AbortSignal;
onBatchComplete?: (filesInBatch: number) => void;
}
@ -189,7 +189,7 @@ export async function uploadFolderScan(params: FolderSyncParams): Promise<number
folderName,
searchSpaceId,
rootFolderId: rootFolderId ?? null,
processingMode,
processingMode,
signal,
onBatchComplete: (count) => {
uploaded += count;

View file

@ -6,9 +6,7 @@ import { zql } from "../schema/index";
// authorizes via `automation_id -> search_space`. No search_space_id on the
// table by design.
export const automationRunQueries = {
byAutomation: defineQuery(
z.object({ automationId: z.number() }),
({ args: { automationId } }) =>
zql.automation_runs.where("automationId", automationId).orderBy("createdAt", "desc")
byAutomation: defineQuery(z.object({ automationId: z.number() }), ({ args: { automationId } }) =>
zql.automation_runs.where("automationId", automationId).orderBy("createdAt", "desc")
),
};