@databricks/appkit-ui 0.18.0 → 0.19.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.
Files changed (59) hide show
  1. package/CLAUDE.md +8 -1
  2. package/dist/cli/commands/plugin/create/scaffold.js +2 -8
  3. package/dist/cli/commands/plugin/create/scaffold.js.map +1 -1
  4. package/dist/react/file-browser/directory-list.d.ts +54 -0
  5. package/dist/react/file-browser/directory-list.d.ts.map +1 -0
  6. package/dist/react/file-browser/directory-list.js +74 -0
  7. package/dist/react/file-browser/directory-list.js.map +1 -0
  8. package/dist/react/file-browser/file-breadcrumb.d.ts +25 -0
  9. package/dist/react/file-browser/file-breadcrumb.d.ts.map +1 -0
  10. package/dist/react/file-browser/file-breadcrumb.js +27 -0
  11. package/dist/react/file-browser/file-breadcrumb.js.map +1 -0
  12. package/dist/react/file-browser/file-entry.d.ts +27 -0
  13. package/dist/react/file-browser/file-entry.d.ts.map +1 -0
  14. package/dist/react/file-browser/file-entry.js +31 -0
  15. package/dist/react/file-browser/file-entry.js.map +1 -0
  16. package/dist/react/file-browser/file-preview-panel.d.ts +42 -0
  17. package/dist/react/file-browser/file-preview-panel.d.ts.map +1 -0
  18. package/dist/react/file-browser/file-preview-panel.js +135 -0
  19. package/dist/react/file-browser/file-preview-panel.js.map +1 -0
  20. package/dist/react/file-browser/index.d.ts +7 -0
  21. package/dist/react/file-browser/index.js +6 -0
  22. package/dist/react/file-browser/new-folder-input.d.ts +36 -0
  23. package/dist/react/file-browser/new-folder-input.d.ts.map +1 -0
  24. package/dist/react/file-browser/new-folder-input.js +52 -0
  25. package/dist/react/file-browser/new-folder-input.js.map +1 -0
  26. package/dist/react/file-browser/types.d.ts +52 -0
  27. package/dist/react/file-browser/types.d.ts.map +1 -0
  28. package/dist/react/genie/genie-chat-message-list.js +1 -1
  29. package/dist/react/genie/genie-chat-message.js +1 -1
  30. package/dist/react/index.d.ts +9 -1
  31. package/dist/react/index.js +12 -5
  32. package/dist/react/lib/format.d.ts +14 -0
  33. package/dist/react/lib/format.d.ts.map +1 -0
  34. package/dist/react/lib/format.js +17 -1
  35. package/dist/react/lib/format.js.map +1 -1
  36. package/dist/react/table/data-table.js +1 -1
  37. package/dist/react/table/table-wrapper.js +1 -1
  38. package/dist/react/ui/breadcrumb.js +1 -1
  39. package/dist/react/ui/index.js +3 -3
  40. package/dist/react/ui/navigation-menu.js +1 -1
  41. package/dist/react/ui/sidebar.js +1 -1
  42. package/docs/api/appkit/Class.Plugin.md +60 -12
  43. package/docs/api/appkit/Class.ResourceRegistry.md +3 -3
  44. package/docs/api/appkit/Function.createApp.md +3 -3
  45. package/docs/api/appkit/Interface.PluginManifest.md +9 -3
  46. package/docs/api/appkit/TypeAlias.PluginData.md +45 -0
  47. package/docs/api/appkit/TypeAlias.ToPlugin.md +1 -1
  48. package/docs/api/appkit-ui/files/DirectoryList.md +36 -0
  49. package/docs/api/appkit-ui/files/FileBreadcrumb.md +27 -0
  50. package/docs/api/appkit-ui/files/FileEntry.md +27 -0
  51. package/docs/api/appkit-ui/files/FilePreviewPanel.md +32 -0
  52. package/docs/api/appkit-ui/files/NewFolderInput.md +30 -0
  53. package/docs/api/appkit.md +1 -0
  54. package/docs/configuration.md +15 -0
  55. package/docs/plugins/custom-plugins.md +4 -13
  56. package/docs/plugins/files.md +350 -0
  57. package/docs/plugins.md +2 -1
  58. package/llms.txt +8 -1
  59. package/package.json +1 -1
@@ -0,0 +1,36 @@
1
+ import { FileBrowserLabels } from "./types.js";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+
4
+ //#region src/react/file-browser/new-folder-input.d.ts
5
+ /** Props for the NewFolderInput component */
6
+ interface NewFolderInputProps extends Omit<React.ComponentProps<"div">, "children" | "onChange"> {
7
+ /** Current folder name value */
8
+ value: string;
9
+ /** Called when folder name changes */
10
+ onChange: (value: string) => void;
11
+ /** Called when the user confirms creation */
12
+ onCreate: () => void;
13
+ /** Called when the user cancels */
14
+ onCancel: () => void;
15
+ /** Whether folder creation is in progress */
16
+ creating?: boolean;
17
+ /** Auto-focus the input on mount */
18
+ autoFocus?: boolean;
19
+ /** Customizable labels */
20
+ labels?: Pick<FileBrowserLabels, "create" | "folderNamePlaceholder">;
21
+ }
22
+ /** Inline folder-name input with create/cancel actions */
23
+ declare function NewFolderInput({
24
+ value,
25
+ onChange,
26
+ onCreate,
27
+ onCancel,
28
+ creating,
29
+ autoFocus,
30
+ labels,
31
+ className,
32
+ ...props
33
+ }: NewFolderInputProps): react_jsx_runtime0.JSX.Element;
34
+ //#endregion
35
+ export { NewFolderInput, NewFolderInputProps };
36
+ //# sourceMappingURL=new-folder-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-folder-input.d.ts","names":[],"sources":["../../../src/react/file-browser/new-folder-input.tsx"],"mappings":";;;;;UAOiB,mBAAA,SACP,IAAA,CAAK,KAAA,CAAM,cAAA;;EAEnB,KAAA;EAFA;EAIA,QAAA,GAAW,KAAA;EAJE;EAMb,QAAA;EAQS;EANT,QAAA;EARY;EAUZ,QAAA;EAVQ;EAYR,SAAA;EAZmB;EAcnB,MAAA,GAAS,IAAA,CAAK,iBAAA;AAAA;;iBAIA,cAAA,CAAA;EACd,KAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,SAAA;EACA,MAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,mBAAA,GAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,52 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { Button } from "../ui/button.js";
3
+ import { useEffect, useRef } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { FolderPlus, Loader2, X } from "lucide-react";
6
+
7
+ //#region src/react/file-browser/new-folder-input.tsx
8
+ /** Inline folder-name input with create/cancel actions */
9
+ function NewFolderInput({ value, onChange, onCreate, onCancel, creating, autoFocus = true, labels, className, ...props }) {
10
+ const inputRef = useRef(null);
11
+ useEffect(() => {
12
+ if (autoFocus) inputRef.current?.focus();
13
+ }, [autoFocus]);
14
+ return /* @__PURE__ */ jsxs("div", {
15
+ "data-slot": "new-folder-input",
16
+ className: cn("flex items-center gap-2 px-4 py-3 border-b bg-muted/30", className),
17
+ ...props,
18
+ children: [
19
+ /* @__PURE__ */ jsx(FolderPlus, { className: "h-5 w-5 text-blue-500 shrink-0" }),
20
+ /* @__PURE__ */ jsx("input", {
21
+ ref: inputRef,
22
+ type: "text",
23
+ value,
24
+ onChange: (e) => onChange(e.target.value),
25
+ onKeyDown: (e) => {
26
+ if (e.key === "Enter") onCreate();
27
+ if (e.key === "Escape") onCancel();
28
+ },
29
+ placeholder: labels?.folderNamePlaceholder ?? "Folder name",
30
+ className: "flex-1 text-sm bg-background border rounded px-2 py-1 outline-none focus:ring-1 focus:ring-ring",
31
+ disabled: creating
32
+ }),
33
+ /* @__PURE__ */ jsx(Button, {
34
+ variant: "ghost",
35
+ size: "sm",
36
+ disabled: creating || !value.trim(),
37
+ onClick: onCreate,
38
+ children: creating ? /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : labels?.create ?? "Create"
39
+ }),
40
+ /* @__PURE__ */ jsx("button", {
41
+ type: "button",
42
+ onClick: onCancel,
43
+ className: "text-muted-foreground hover:text-foreground",
44
+ children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
45
+ })
46
+ ]
47
+ });
48
+ }
49
+
50
+ //#endregion
51
+ export { NewFolderInput };
52
+ //# sourceMappingURL=new-folder-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-folder-input.js","names":[],"sources":["../../../src/react/file-browser/new-folder-input.tsx"],"sourcesContent":["import { FolderPlus, Loader2, X } from \"lucide-react\";\nimport { useEffect, useRef } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport type { FileBrowserLabels } from \"./types\";\n\n/** Props for the NewFolderInput component */\nexport interface NewFolderInputProps\n extends Omit<React.ComponentProps<\"div\">, \"children\" | \"onChange\"> {\n /** Current folder name value */\n value: string;\n /** Called when folder name changes */\n onChange: (value: string) => void;\n /** Called when the user confirms creation */\n onCreate: () => void;\n /** Called when the user cancels */\n onCancel: () => void;\n /** Whether folder creation is in progress */\n creating?: boolean;\n /** Auto-focus the input on mount */\n autoFocus?: boolean;\n /** Customizable labels */\n labels?: Pick<FileBrowserLabels, \"create\" | \"folderNamePlaceholder\">;\n}\n\n/** Inline folder-name input with create/cancel actions */\nexport function NewFolderInput({\n value,\n onChange,\n onCreate,\n onCancel,\n creating,\n autoFocus = true,\n labels,\n className,\n ...props\n}: NewFolderInputProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (autoFocus) {\n inputRef.current?.focus();\n }\n }, [autoFocus]);\n\n return (\n <div\n data-slot=\"new-folder-input\"\n className={cn(\n \"flex items-center gap-2 px-4 py-3 border-b bg-muted/30\",\n className,\n )}\n {...props}\n >\n <FolderPlus className=\"h-5 w-5 text-blue-500 shrink-0\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") onCreate();\n if (e.key === \"Escape\") onCancel();\n }}\n placeholder={labels?.folderNamePlaceholder ?? \"Folder name\"}\n className=\"flex-1 text-sm bg-background border rounded px-2 py-1 outline-none focus:ring-1 focus:ring-ring\"\n disabled={creating}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={creating || !value.trim()}\n onClick={onCreate}\n >\n {creating ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n (labels?.create ?? \"Create\")\n )}\n </Button>\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n );\n}\n"],"mappings":";;;;;;;;AA0BA,SAAgB,eAAe,EAC7B,OACA,UACA,UACA,UACA,UACA,YAAY,MACZ,QACA,WACA,GAAG,SACmB;CACtB,MAAM,WAAW,OAAyB,KAAK;AAE/C,iBAAgB;AACd,MAAI,UACF,UAAS,SAAS,OAAO;IAE1B,CAAC,UAAU,CAAC;AAEf,QACE,qBAAC;EACC,aAAU;EACV,WAAW,GACT,0DACA,UACD;EACD,GAAI;;GAEJ,oBAAC,cAAW,WAAU,mCAAmC;GACzD,oBAAC;IACC,KAAK;IACL,MAAK;IACE;IACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;IACzC,YAAY,MAAM;AAChB,SAAI,EAAE,QAAQ,QAAS,WAAU;AACjC,SAAI,EAAE,QAAQ,SAAU,WAAU;;IAEpC,aAAa,QAAQ,yBAAyB;IAC9C,WAAU;IACV,UAAU;KACV;GACF,oBAAC;IACC,SAAQ;IACR,MAAK;IACL,UAAU,YAAY,CAAC,MAAM,MAAM;IACnC,SAAS;cAER,WACC,oBAAC,WAAQ,WAAU,yBAAyB,GAE3C,QAAQ,UAAU;KAEd;GACT,oBAAC;IACC,MAAK;IACL,SAAS;IACT,WAAU;cAEV,oBAAC,KAAE,WAAU,YAAY;KAClB;;GACL"}
@@ -0,0 +1,52 @@
1
+ //#region src/react/file-browser/types.d.ts
2
+ /** A single entry (file or directory) in a directory listing */
3
+ interface DirectoryEntry {
4
+ name?: string;
5
+ path?: string;
6
+ is_directory?: boolean;
7
+ file_size?: number;
8
+ last_modified?: string;
9
+ }
10
+ /** Metadata and content preview for a selected file */
11
+ interface FilePreview {
12
+ contentLength: number | undefined;
13
+ contentType: string | undefined;
14
+ lastModified: string | undefined;
15
+ textPreview: string | null;
16
+ isText: boolean;
17
+ isImage: boolean;
18
+ }
19
+ /** Customizable labels for file browser components (i18n-ready) */
20
+ interface FileBrowserLabels {
21
+ /** Back button text (default: "Back to parent") */
22
+ backToParent?: string;
23
+ /** Empty directory message (default: "This directory is empty.") */
24
+ emptyDirectory?: string;
25
+ /** No volume configured message */
26
+ noVolumeConfigured?: string;
27
+ /** Retry button text (default: "Retry") */
28
+ retry?: string;
29
+ /** Select file prompt (default: "Select a file to preview") */
30
+ selectFilePrompt?: string;
31
+ /** Preview not available message */
32
+ previewNotAvailable?: string;
33
+ /** Failed to load preview message */
34
+ previewFailed?: string;
35
+ /** Download button text (default: "Download") */
36
+ download?: string;
37
+ /** Create button text (default: "Create") */
38
+ create?: string;
39
+ /** Folder name placeholder (default: "Folder name") */
40
+ folderNamePlaceholder?: string;
41
+ /** Size label (default: "Size") */
42
+ size?: string;
43
+ /** Type label (default: "Type") */
44
+ type?: string;
45
+ /** Modified label (default: "Modified") */
46
+ modified?: string;
47
+ /** Unknown value fallback (default: "Unknown") */
48
+ unknown?: string;
49
+ }
50
+ //#endregion
51
+ export { DirectoryEntry, FileBrowserLabels, FilePreview };
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/react/file-browser/types.ts"],"mappings":";;UACiB,cAAA;EACf,IAAA;EACA,IAAA;EACA,YAAA;EACA,SAAA;EACA,aAAA;AAAA;;UAIe,WAAA;EACf,aAAA;EACA,WAAA;EACA,YAAA;EACA,WAAA;EACA,MAAA;EACA,OAAA;AAAA;;UAIe,iBAAA;EANf;EAQA,YAAA;EANA;EAQA,cAAA;EARO;EAUP,kBAAA;EANgC;EAQhC,KAAA;EARgC;EAUhC,gBAAA;EANA;EAQA,mBAAA;EAJA;EAMA,aAAA;EAFA;EAIA,QAAA;EAAA;EAEA,MAAA;EAEA;EAAA,qBAAA;EAIA;EAFA,IAAA;EAMA;EAJA,IAAA;EAIO;EAFP,QAAA;;EAEA,OAAA;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { cn } from "../lib/utils.js";
2
- import { ScrollArea } from "../ui/scroll-area.js";
3
2
  import { Skeleton } from "../ui/skeleton.js";
3
+ import { ScrollArea } from "../ui/scroll-area.js";
4
4
  import { Spinner } from "../ui/spinner.js";
5
5
  import { GenieChatMessage } from "./genie-chat-message.js";
6
6
  import { useEffect, useLayoutEffect, useRef } from "react";
@@ -1,6 +1,6 @@
1
1
  import { cn } from "../lib/utils.js";
2
- import { Avatar, AvatarFallback } from "../ui/avatar.js";
3
2
  import { Card } from "../ui/card.js";
3
+ import { Avatar, AvatarFallback } from "../ui/avatar.js";
4
4
  import { GenieQueryVisualization } from "./genie-query-visualization.js";
5
5
  import { useMemo } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -18,6 +18,14 @@ import { useAllThemeColors, useThemeColors } from "./charts/theme.js";
18
18
  import { createTimeSeriesData, formatLabel, sortTimeSeriesAscending, toChartArray, toChartValue, truncateLabel } from "./charts/utils.js";
19
19
  import { CartesianContext, HeatmapContext, OptionBuilderContext, buildCartesianOption, buildHeatmapOption, buildHorizontalBarOption, buildPieOption, buildRadarOption } from "./charts/options.js";
20
20
  import "./charts/index.js";
21
+ import { formatFileSize } from "./lib/format.js";
22
+ import { DirectoryEntry, FileBrowserLabels, FilePreview } from "./file-browser/types.js";
23
+ import { DirectoryList, DirectoryListProps } from "./file-browser/directory-list.js";
24
+ import { FileBreadcrumb, FileBreadcrumbProps } from "./file-browser/file-breadcrumb.js";
25
+ import { FileEntry, FileEntryProps } from "./file-browser/file-entry.js";
26
+ import { FilePreviewPanel, FilePreviewPanelProps } from "./file-browser/file-preview-panel.js";
27
+ import { NewFolderInput, NewFolderInputProps } from "./file-browser/new-folder-input.js";
28
+ import "./file-browser/index.js";
21
29
  import { ColumnCategory, GenieColumnMeta, TransformedGenieData, transformGenieData } from "./genie/genie-query-transform.js";
22
30
  import { ChartInference, inferChartType } from "./genie/genie-chart-inference.js";
23
31
  import { GenieChatProps, GenieChatStatus, GenieMessageItem, UseGenieChatOptions, UseGenieChatReturn } from "./genie/types.js";
@@ -89,4 +97,4 @@ import { Textarea } from "./ui/textarea.js";
89
97
  import { Toggle, toggleVariants } from "./ui/toggle.js";
90
98
  import { ToggleGroup, ToggleGroupItem } from "./ui/toggle-group.js";
91
99
  import "./ui/index.js";
92
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AnalyticsFormat, AreaChart, AreaChartProps, AreaChartSpecificProps, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, BarChart, BarChartProps, BarChartSpecificProps, BaseChart, BaseChartProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CHART_COLOR_VARS, CHART_COLOR_VARS_CATEGORICAL, CHART_COLOR_VARS_DIVERGING, CHART_COLOR_VARS_SEQUENTIAL, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, CartesianContext, ChartBaseProps, ChartColorPalette, ChartConfig, ChartContainer, ChartData, ChartInference, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, ChartType, ChartWrapper, ChartWrapperProps, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, ColumnCategory, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DATE_FIELD_PATTERNS, DataFormat, DataProps, DataTable, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DonutChart, DonutChartProps, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, FALLBACK_COLORS, FALLBACK_COLORS_CATEGORICAL, FALLBACK_COLORS_DIVERGING, FALLBACK_COLORS_SEQUENTIAL, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, GenieAttachmentResponse, GenieChat, GenieChatInput, GenieChatMessage, GenieChatMessageList, GenieChatProps, GenieChatStatus, GenieColumnMeta, GenieMessageItem, GenieMessageResponse, GenieQueryVisualization, GenieStatementResponse, GenieStreamEvent, HeatmapChart, HeatmapChartProps, HeatmapChartSpecificProps, HeatmapContext, HoverCard, HoverCardContent, HoverCardTrigger, InferResultByFormat, InferRowType, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, LineChart, LineChartProps, LineChartSpecificProps, METADATA_DATE_PATTERNS, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NAME_FIELD_PATTERNS, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NormalizedChartData, NormalizedChartDataBase, NormalizedHeatmapData, OptionBuilderContext, Orientation, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PieChart, PieChartProps, PieChartSpecificProps, PluginRegistry, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalContainerContext, PortalContainerProvider, Progress, QueryProps, QueryRegistry, RadarChart, RadarChartProps, RadarChartSpecificProps, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScatterChart, ScatterChartProps, ScatterChartSpecificProps, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TransformedGenieData, TypedArrowTable, UnifiedChartProps, UseAnalyticsQueryOptions, UseAnalyticsQueryResult, UseChartDataOptions, UseChartDataResult, UseGenieChatOptions, UseGenieChatReturn, badgeVariants, buildCartesianOption, buildHeatmapOption, buildHorizontalBarOption, buildPieOption, buildRadarOption, buttonGroupVariants, buttonVariants, cn, createChart, createTimeSeriesData, formatLabel, inferChartType, isArrowTable, isDataProps, isQueryProps, navigationMenuTriggerStyle, normalizeChartData, normalizeHeatmapData, sortTimeSeriesAscending, toChartArray, toChartValue, toggleVariants, transformGenieData, truncateLabel, useAllThemeColors, useAnalyticsQuery, useChartData, useFormField, useGenieChat, usePortalContainer, useResolvedPortalContainer, useSidebar, useThemeColors };
100
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AnalyticsFormat, AreaChart, AreaChartProps, AreaChartSpecificProps, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, BarChart, BarChartProps, BarChartSpecificProps, BaseChart, BaseChartProps, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CHART_COLOR_VARS, CHART_COLOR_VARS_CATEGORICAL, CHART_COLOR_VARS_DIVERGING, CHART_COLOR_VARS_SEQUENTIAL, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselApi, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, CartesianContext, ChartBaseProps, ChartColorPalette, ChartConfig, ChartContainer, ChartData, ChartInference, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, ChartType, ChartWrapper, ChartWrapperProps, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, ColumnCategory, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DATE_FIELD_PATTERNS, DataFormat, DataProps, DataTable, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DirectoryEntry, DirectoryList, DirectoryListProps, DonutChart, DonutChartProps, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, FALLBACK_COLORS, FALLBACK_COLORS_CATEGORICAL, FALLBACK_COLORS_DIVERGING, FALLBACK_COLORS_SEQUENTIAL, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, FileBreadcrumb, FileBreadcrumbProps, FileBrowserLabels, FileEntry, FileEntryProps, FilePreview, FilePreviewPanel, FilePreviewPanelProps, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, GenieAttachmentResponse, GenieChat, GenieChatInput, GenieChatMessage, GenieChatMessageList, GenieChatProps, GenieChatStatus, GenieColumnMeta, GenieMessageItem, GenieMessageResponse, GenieQueryVisualization, GenieStatementResponse, GenieStreamEvent, HeatmapChart, HeatmapChartProps, HeatmapChartSpecificProps, HeatmapContext, HoverCard, HoverCardContent, HoverCardTrigger, InferResultByFormat, InferRowType, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, LineChart, LineChartProps, LineChartSpecificProps, METADATA_DATE_PATTERNS, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NAME_FIELD_PATTERNS, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NewFolderInput, NewFolderInputProps, NormalizedChartData, NormalizedChartDataBase, NormalizedHeatmapData, OptionBuilderContext, Orientation, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PieChart, PieChartProps, PieChartSpecificProps, PluginRegistry, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalContainerContext, PortalContainerProvider, Progress, QueryProps, QueryRegistry, RadarChart, RadarChartProps, RadarChartSpecificProps, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScatterChart, ScatterChartProps, ScatterChartSpecificProps, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TransformedGenieData, TypedArrowTable, UnifiedChartProps, UseAnalyticsQueryOptions, UseAnalyticsQueryResult, UseChartDataOptions, UseChartDataResult, UseGenieChatOptions, UseGenieChatReturn, badgeVariants, buildCartesianOption, buildHeatmapOption, buildHorizontalBarOption, buildPieOption, buildRadarOption, buttonGroupVariants, buttonVariants, cn, createChart, createTimeSeriesData, formatFileSize, formatLabel, inferChartType, isArrowTable, isDataProps, isQueryProps, navigationMenuTriggerStyle, normalizeChartData, normalizeHeatmapData, sortTimeSeriesAscending, toChartArray, toChartValue, toggleVariants, transformGenieData, truncateLabel, useAllThemeColors, useAnalyticsQuery, useChartData, useFormField, useGenieChat, usePortalContainer, useResolvedPortalContainer, useSidebar, useThemeColors };
@@ -18,15 +18,23 @@ import { DonutChart, PieChart } from "./charts/pie/index.js";
18
18
  import { RadarChart } from "./charts/radar/index.js";
19
19
  import { ScatterChart } from "./charts/scatter/index.js";
20
20
  import "./charts/index.js";
21
- import { inferChartType } from "./genie/genie-chart-inference.js";
21
+ import { formatFileSize } from "./lib/format.js";
22
22
  import { cn } from "./lib/utils.js";
23
23
  import { Button, buttonVariants } from "./ui/button.js";
24
+ import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "./ui/card.js";
25
+ import { Skeleton } from "./ui/skeleton.js";
26
+ import { FileEntry } from "./file-browser/file-entry.js";
27
+ import { DirectoryList } from "./file-browser/directory-list.js";
28
+ import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "./ui/breadcrumb.js";
29
+ import { FileBreadcrumb } from "./file-browser/file-breadcrumb.js";
30
+ import { FilePreviewPanel } from "./file-browser/file-preview-panel.js";
31
+ import { NewFolderInput } from "./file-browser/new-folder-input.js";
32
+ import "./file-browser/index.js";
33
+ import { inferChartType } from "./genie/genie-chart-inference.js";
24
34
  import { GenieChatInput } from "./genie/genie-chat-input.js";
25
35
  import { ScrollArea, ScrollBar } from "./ui/scroll-area.js";
26
- import { Skeleton } from "./ui/skeleton.js";
27
36
  import { Spinner } from "./ui/spinner.js";
28
37
  import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar.js";
29
- import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "./ui/card.js";
30
38
  import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "./ui/table.js";
31
39
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "./ui/tabs.js";
32
40
  import { transformGenieData } from "./genie/genie-query-transform.js";
@@ -49,7 +57,6 @@ import { Alert, AlertDescription, AlertTitle } from "./ui/alert.js";
49
57
  import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from "./ui/alert-dialog.js";
50
58
  import { AspectRatio } from "./ui/aspect-ratio.js";
51
59
  import { Badge, badgeVariants } from "./ui/badge.js";
52
- import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "./ui/breadcrumb.js";
53
60
  import { Separator } from "./ui/separator.js";
54
61
  import { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants } from "./ui/button-group.js";
55
62
  import { Calendar, CalendarDayButton } from "./ui/calendar.js";
@@ -87,4 +94,4 @@ import { Toggle, toggleVariants } from "./ui/toggle.js";
87
94
  import { ToggleGroup, ToggleGroupItem } from "./ui/toggle-group.js";
88
95
  import "./ui/index.js";
89
96
 
90
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AreaChart, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, BarChart, BaseChart, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CHART_COLOR_VARS, CHART_COLOR_VARS_CATEGORICAL, CHART_COLOR_VARS_DIVERGING, CHART_COLOR_VARS_SEQUENTIAL, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, ChartWrapper, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DATE_FIELD_PATTERNS, DataTable, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DonutChart, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, FALLBACK_COLORS, FALLBACK_COLORS_CATEGORICAL, FALLBACK_COLORS_DIVERGING, FALLBACK_COLORS_SEQUENTIAL, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, GenieChat, GenieChatInput, GenieChatMessage, GenieChatMessageList, GenieQueryVisualization, HeatmapChart, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, LineChart, METADATA_DATE_PATTERNS, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NAME_FIELD_PATTERNS, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PieChart, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalContainerContext, PortalContainerProvider, Progress, RadarChart, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScatterChart, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buildCartesianOption, buildHeatmapOption, buildHorizontalBarOption, buildPieOption, buildRadarOption, buttonGroupVariants, buttonVariants, cn, createChart, createTimeSeriesData, formatLabel, inferChartType, isArrowTable, isDataProps, isQueryProps, navigationMenuTriggerStyle, normalizeChartData, normalizeHeatmapData, sortTimeSeriesAscending, toChartArray, toChartValue, toggleVariants, transformGenieData, truncateLabel, useAllThemeColors, useAnalyticsQuery, useChartData, useFormField, useGenieChat, usePortalContainer, useResolvedPortalContainer, useSidebar, useThemeColors };
97
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AreaChart, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, BarChart, BaseChart, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CHART_COLOR_VARS, CHART_COLOR_VARS_CATEGORICAL, CHART_COLOR_VARS_DIVERGING, CHART_COLOR_VARS_SEQUENTIAL, Calendar, CalendarDayButton, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent, ChartWrapper, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DATE_FIELD_PATTERNS, DataTable, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DirectoryList, DonutChart, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, FALLBACK_COLORS, FALLBACK_COLORS_CATEGORICAL, FALLBACK_COLORS_DIVERGING, FALLBACK_COLORS_SEQUENTIAL, Field, FieldContent, FieldDescription, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTitle, FileBreadcrumb, FileEntry, FilePreviewPanel, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, GenieChat, GenieChatInput, GenieChatMessage, GenieChatMessageList, GenieQueryVisualization, HeatmapChart, HoverCard, HoverCardContent, HoverCardTrigger, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, Item, ItemActions, ItemContent, ItemDescription, ItemFooter, ItemGroup, ItemHeader, ItemMedia, ItemSeparator, ItemTitle, Kbd, KbdGroup, Label, LineChart, METADATA_DATE_PATTERNS, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NAME_FIELD_PATTERNS, NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, NewFolderInput, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, PieChart, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PortalContainerContext, PortalContainerProvider, Progress, RadarChart, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScatterChart, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Spinner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buildCartesianOption, buildHeatmapOption, buildHorizontalBarOption, buildPieOption, buildRadarOption, buttonGroupVariants, buttonVariants, cn, createChart, createTimeSeriesData, formatFileSize, formatLabel, inferChartType, isArrowTable, isDataProps, isQueryProps, navigationMenuTriggerStyle, normalizeChartData, normalizeHeatmapData, sortTimeSeriesAscending, toChartArray, toChartValue, toggleVariants, transformGenieData, truncateLabel, useAllThemeColors, useAnalyticsQuery, useChartData, useFormField, useGenieChat, usePortalContainer, useResolvedPortalContainer, useSidebar, useThemeColors };
@@ -0,0 +1,14 @@
1
+ //#region src/react/lib/format.d.ts
2
+ /**
3
+ * Formats byte values into human-readable file sizes
4
+ * @param bytes - The file size in bytes
5
+ * @returns Formatted string (e.g., "1.5 KB", "3.2 MB")
6
+ * @example
7
+ * formatFileSize(512) // "512 B"
8
+ * formatFileSize(1536) // "1.5 KB"
9
+ * formatFileSize(2621440) // "2.5 MB"
10
+ */
11
+ declare function formatFileSize(bytes: number | undefined): string;
12
+ //#endregion
13
+ export { formatFileSize };
14
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","names":[],"sources":["../../../src/react/lib/format.ts"],"mappings":";;;;;;;;;;iBAiEgB,cAAA,CAAe,KAAA"}
@@ -34,9 +34,25 @@ function formatChartValue(value, fieldName) {
34
34
  function formatFieldLabel(field) {
35
35
  return field.replace(/[^a-zA-Z0-9_-]/g, "").replace(/([A-Z])/g, " $1").replace(/_/g, " ").replace(/\b\w/g, (l) => l.toUpperCase()).trim();
36
36
  }
37
+ /**
38
+ * Formats byte values into human-readable file sizes
39
+ * @param bytes - The file size in bytes
40
+ * @returns Formatted string (e.g., "1.5 KB", "3.2 MB")
41
+ * @example
42
+ * formatFileSize(512) // "512 B"
43
+ * formatFileSize(1536) // "1.5 KB"
44
+ * formatFileSize(2621440) // "2.5 MB"
45
+ */
46
+ function formatFileSize(bytes) {
47
+ if (bytes === void 0 || bytes === null) return "Unknown";
48
+ if (bytes < 1024) return `${bytes} B`;
49
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
50
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
51
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
52
+ }
37
53
  /** Regex for validating field names */
38
54
  const SAFE_KEY_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
39
55
 
40
56
  //#endregion
41
- export { SAFE_KEY_REGEX, formatChartValue, formatFieldLabel };
57
+ export { SAFE_KEY_REGEX, formatChartValue, formatFieldLabel, formatFileSize };
42
58
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","names":[],"sources":["../../../src/react/lib/format.ts"],"sourcesContent":["/**\n * Formats numeric values based on field name context\n * @param value - The numeric value to format\n * @param fieldName - The field name to determine formatting\n * @returns Formatted string representation\n * @example\n * formatChartValue(1234.56, \"cost\") // \"$1,234.56\"\n * formatChartValue(5000, \"users\") // \"5.0k\"\n * formatChartValue(42.7, \"percentage\") // \"42.7\"\n */\nexport function formatChartValue(value: number, fieldName: string): string {\n if (\n fieldName.toLowerCase().includes(\"cost\") ||\n fieldName.toLowerCase().includes(\"price\") ||\n fieldName.toLowerCase().includes(\"spend\") ||\n fieldName.toLowerCase().includes(\"revenue\") ||\n fieldName.toLowerCase().includes(\"usd\")\n ) {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n }\n\n if (value >= 1000) {\n return new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n maximumFractionDigits: 1,\n }).format(value);\n }\n\n return value.toLocaleString(\"en-US\", {\n maximumFractionDigits: 2,\n });\n}\n\n/**\n * Converts field names to human-readable labels\n * @param field - Field name in camelCase or snake_case\n * @returns Formatted label with proper capitalization\n * @example\n * formatFieldLabel(\"totalCost\") // \"Total Cost\"\n * formatFieldLabel(\"user_name\") // \"User Name\"\n * formatFieldLabel(\"revenue\") // \"Revenue\"\n */\nexport function formatFieldLabel(field: string): string {\n const safe = field.replace(/[^a-zA-Z0-9_-]/g, \"\");\n return safe\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (l) => l.toUpperCase())\n .trim();\n}\n\n/** Regex for validating field names */\nexport const SAFE_KEY_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,iBAAiB,OAAe,WAA2B;AACzE,KACE,UAAU,aAAa,CAAC,SAAS,OAAO,IACxC,UAAU,aAAa,CAAC,SAAS,QAAQ,IACzC,UAAU,aAAa,CAAC,SAAS,QAAQ,IACzC,UAAU,aAAa,CAAC,SAAS,UAAU,IAC3C,UAAU,aAAa,CAAC,SAAS,MAAM,CAEvC,QAAO,IAAI,KAAK,aAAa,SAAS;EACpC,OAAO;EACP,UAAU;EACV,uBAAuB;EACvB,uBAAuB;EACxB,CAAC,CAAC,OAAO,MAAM;AAGlB,KAAI,SAAS,IACX,QAAO,IAAI,KAAK,aAAa,SAAS;EACpC,UAAU;EACV,uBAAuB;EACxB,CAAC,CAAC,OAAO,MAAM;AAGlB,QAAO,MAAM,eAAe,SAAS,EACnC,uBAAuB,GACxB,CAAC;;;;;;;;;;;AAYJ,SAAgB,iBAAiB,OAAuB;AAEtD,QADa,MAAM,QAAQ,mBAAmB,GAAG,CAE9C,QAAQ,YAAY,MAAM,CAC1B,QAAQ,MAAM,IAAI,CAClB,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC,CACxC,MAAM;;;AAIX,MAAa,iBAAiB"}
1
+ {"version":3,"file":"format.js","names":[],"sources":["../../../src/react/lib/format.ts"],"sourcesContent":["/**\n * Formats numeric values based on field name context\n * @param value - The numeric value to format\n * @param fieldName - The field name to determine formatting\n * @returns Formatted string representation\n * @example\n * formatChartValue(1234.56, \"cost\") // \"$1,234.56\"\n * formatChartValue(5000, \"users\") // \"5.0k\"\n * formatChartValue(42.7, \"percentage\") // \"42.7\"\n */\nexport function formatChartValue(value: number, fieldName: string): string {\n if (\n fieldName.toLowerCase().includes(\"cost\") ||\n fieldName.toLowerCase().includes(\"price\") ||\n fieldName.toLowerCase().includes(\"spend\") ||\n fieldName.toLowerCase().includes(\"revenue\") ||\n fieldName.toLowerCase().includes(\"usd\")\n ) {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n }\n\n if (value >= 1000) {\n return new Intl.NumberFormat(\"en-US\", {\n notation: \"compact\",\n maximumFractionDigits: 1,\n }).format(value);\n }\n\n return value.toLocaleString(\"en-US\", {\n maximumFractionDigits: 2,\n });\n}\n\n/**\n * Converts field names to human-readable labels\n * @param field - Field name in camelCase or snake_case\n * @returns Formatted label with proper capitalization\n * @example\n * formatFieldLabel(\"totalCost\") // \"Total Cost\"\n * formatFieldLabel(\"user_name\") // \"User Name\"\n * formatFieldLabel(\"revenue\") // \"Revenue\"\n */\nexport function formatFieldLabel(field: string): string {\n const safe = field.replace(/[^a-zA-Z0-9_-]/g, \"\");\n return safe\n .replace(/([A-Z])/g, \" $1\")\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (l) => l.toUpperCase())\n .trim();\n}\n\n/**\n * Formats byte values into human-readable file sizes\n * @param bytes - The file size in bytes\n * @returns Formatted string (e.g., \"1.5 KB\", \"3.2 MB\")\n * @example\n * formatFileSize(512) // \"512 B\"\n * formatFileSize(1536) // \"1.5 KB\"\n * formatFileSize(2621440) // \"2.5 MB\"\n */\nexport function formatFileSize(bytes: number | undefined): string {\n if (bytes === undefined || bytes === null) return \"Unknown\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024)\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/** Regex for validating field names */\nexport const SAFE_KEY_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n"],"mappings":";;;;;;;;;;;AAUA,SAAgB,iBAAiB,OAAe,WAA2B;AACzE,KACE,UAAU,aAAa,CAAC,SAAS,OAAO,IACxC,UAAU,aAAa,CAAC,SAAS,QAAQ,IACzC,UAAU,aAAa,CAAC,SAAS,QAAQ,IACzC,UAAU,aAAa,CAAC,SAAS,UAAU,IAC3C,UAAU,aAAa,CAAC,SAAS,MAAM,CAEvC,QAAO,IAAI,KAAK,aAAa,SAAS;EACpC,OAAO;EACP,UAAU;EACV,uBAAuB;EACvB,uBAAuB;EACxB,CAAC,CAAC,OAAO,MAAM;AAGlB,KAAI,SAAS,IACX,QAAO,IAAI,KAAK,aAAa,SAAS;EACpC,UAAU;EACV,uBAAuB;EACxB,CAAC,CAAC,OAAO,MAAM;AAGlB,QAAO,MAAM,eAAe,SAAS,EACnC,uBAAuB,GACxB,CAAC;;;;;;;;;;;AAYJ,SAAgB,iBAAiB,OAAuB;AAEtD,QADa,MAAM,QAAQ,mBAAmB,GAAG,CAE9C,QAAQ,YAAY,MAAM,CAC1B,QAAQ,MAAM,IAAI,CAClB,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC,CACxC,MAAM;;;;;;;;;;;AAYX,SAAgB,eAAe,OAAmC;AAChE,KAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,KAAI,QAAQ,KAAM,QAAO,GAAG,MAAM;AAClC,KAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,EAAE,CAAC;AAC7D,KAAI,QAAQ,OAAO,OAAO,KACxB,QAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,EAAE,CAAC;AAC/C,QAAO,IAAI,SAAS,OAAO,OAAO,OAAO,QAAQ,EAAE,CAAC;;;AAItD,MAAa,iBAAiB"}
@@ -1,6 +1,6 @@
1
+ import { formatFieldLabel } from "../lib/format.js";
1
2
  import { Button } from "../ui/button.js";
2
3
  import { Table as Table$1, TableBody, TableCell, TableHead, TableHeader, TableRow } from "../ui/table.js";
3
- import { formatFieldLabel } from "../lib/format.js";
4
4
  import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger } from "../ui/dropdown-menu.js";
5
5
  import { Input } from "../ui/input.js";
6
6
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select.js";
@@ -1,6 +1,6 @@
1
1
  import { useAnalyticsQuery } from "../hooks/use-analytics-query.js";
2
- import { Button } from "../ui/button.js";
3
2
  import { SAFE_KEY_REGEX, formatChartValue, formatFieldLabel } from "../lib/format.js";
3
+ import { Button } from "../ui/button.js";
4
4
  import { Checkbox } from "../ui/checkbox.js";
5
5
  import { EmptyState } from "./empty.js";
6
6
  import { ErrorState } from "./error.js";
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { Slot } from "@radix-ui/react-slot";
4
3
  import { ChevronRight, MoreHorizontal } from "lucide-react";
4
+ import { Slot } from "@radix-ui/react-slot";
5
5
 
6
6
  //#region src/react/ui/breadcrumb.tsx
7
7
  /** Navigation component showing the current page's location in the site hierarchy */
@@ -1,9 +1,10 @@
1
1
  import { Button, buttonVariants } from "./button.js";
2
- import { ScrollArea, ScrollBar } from "./scroll-area.js";
2
+ import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "./card.js";
3
3
  import { Skeleton } from "./skeleton.js";
4
+ import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "./breadcrumb.js";
5
+ import { ScrollArea, ScrollBar } from "./scroll-area.js";
4
6
  import { Spinner } from "./spinner.js";
5
7
  import { Avatar, AvatarFallback, AvatarImage } from "./avatar.js";
6
- import { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "./card.js";
7
8
  import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "./table.js";
8
9
  import { Tabs, TabsContent, TabsList, TabsTrigger } from "./tabs.js";
9
10
  import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from "./dropdown-menu.js";
@@ -15,7 +16,6 @@ import { Alert, AlertDescription, AlertTitle } from "./alert.js";
15
16
  import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from "./alert-dialog.js";
16
17
  import { AspectRatio } from "./aspect-ratio.js";
17
18
  import { Badge, badgeVariants } from "./badge.js";
18
- import { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "./breadcrumb.js";
19
19
  import { Separator } from "./separator.js";
20
20
  import { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants } from "./button-group.js";
21
21
  import { Calendar, CalendarDayButton } from "./calendar.js";
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { cva } from "class-variance-authority";
4
3
  import { ChevronDownIcon } from "lucide-react";
4
+ import { cva } from "class-variance-authority";
5
5
  import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
6
6
 
7
7
  //#region src/react/ui/navigation-menu.tsx
@@ -10,9 +10,9 @@ import { useIsMobile } from "../hooks/use-mobile.js";
10
10
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip.js";
11
11
  import * as React$1 from "react";
12
12
  import { jsx, jsxs } from "react/jsx-runtime";
13
+ import { PanelLeftIcon } from "lucide-react";
13
14
  import { Slot } from "@radix-ui/react-slot";
14
15
  import { cva } from "class-variance-authority";
15
- import { PanelLeftIcon } from "lucide-react";
16
16
 
17
17
  //#region src/react/ui/sidebar.tsx
18
18
  const SIDEBAR_COOKIE_NAME = "sidebar_state";
@@ -32,7 +32,6 @@ const myManifest: PluginManifest = {
32
32
 
33
33
  class MyPlugin extends Plugin<MyConfig> {
34
34
  static manifest = myManifest;
35
- name = 'myPlugin';
36
35
  }
37
36
 
38
37
  ```
@@ -56,8 +55,7 @@ const myManifest: PluginManifest = {
56
55
  };
57
56
 
58
57
  class MyPlugin extends Plugin<MyConfig> {
59
- static manifest = myManifest;
60
- name = 'myPlugin';
58
+ static manifest = myManifest<"myPlugin">;
61
59
 
62
60
  // Runtime method: converts optional resources to required based on config
63
61
  static getResourceRequirements(config: MyConfig) {
@@ -253,7 +251,7 @@ A proxied plugin instance that executes as the user
253
251
 
254
252
  #### Throws[​](#throws "Direct link to Throws")
255
253
 
256
- Error if user token is not available in request headers
254
+ AuthenticationError if user token is not available in request headers (production only). In development mode (`NODE_ENV=development`), falls back to the service principal instead of throwing.
257
255
 
258
256
  ***
259
257
 
@@ -267,6 +265,10 @@ userKey?: string): Promise<T | undefined>;
267
265
 
268
266
  ```
269
267
 
268
+ Execute a function with the plugin's interceptor chain.
269
+
270
+ All errors are caught and `undefined` is returned (production-safe). Route handlers should check for `undefined` and respond with an appropriate error status.
271
+
270
272
  #### Type Parameters[​](#type-parameters-1 "Direct link to Type Parameters")
271
273
 
272
274
  | Type Parameter |
@@ -338,7 +340,6 @@ The returned object becomes the plugin's public API on the AppKit instance (e.g.
338
340
 
339
341
  ```ts
340
342
  class MyPlugin extends Plugin {
341
- name = "myPlugin";
342
343
  private getData() { return []; }
343
344
 
344
345
  exports() {
@@ -381,6 +382,26 @@ BasePlugin.getEndpoints
381
382
 
382
383
  ***
383
384
 
385
+ ### getSkipBodyParsingPaths()[​](#getskipbodyparsingpaths "Direct link to getSkipBodyParsingPaths()")
386
+
387
+ ```ts
388
+ getSkipBodyParsingPaths(): ReadonlySet<string>;
389
+
390
+ ```
391
+
392
+ #### Returns[​](#returns-7 "Direct link to Returns")
393
+
394
+ `ReadonlySet`<`string`>
395
+
396
+ #### Implementation of[​](#implementation-of-4 "Direct link to Implementation of")
397
+
398
+ ```ts
399
+ BasePlugin.getSkipBodyParsingPaths
400
+
401
+ ```
402
+
403
+ ***
404
+
384
405
  ### injectRoutes()[​](#injectroutes "Direct link to injectRoutes()")
385
406
 
386
407
  ```ts
@@ -394,11 +415,11 @@ injectRoutes(_: Router): void;
394
415
  | --------- | -------- |
395
416
  | `_` | `Router` |
396
417
 
397
- #### Returns[​](#returns-7 "Direct link to Returns")
418
+ #### Returns[​](#returns-8 "Direct link to Returns")
398
419
 
399
420
  `void`
400
421
 
401
- #### Implementation of[​](#implementation-of-4 "Direct link to Implementation of")
422
+ #### Implementation of[​](#implementation-of-5 "Direct link to Implementation of")
402
423
 
403
424
  ```ts
404
425
  BasePlugin.injectRoutes
@@ -421,12 +442,39 @@ protected registerEndpoint(name: string, path: string): void;
421
442
  | `name` | `string` |
422
443
  | `path` | `string` |
423
444
 
424
- #### Returns[​](#returns-8 "Direct link to Returns")
445
+ #### Returns[​](#returns-9 "Direct link to Returns")
425
446
 
426
447
  `void`
427
448
 
428
449
  ***
429
450
 
451
+ ### resolveUserId()[​](#resolveuserid "Direct link to resolveUserId()")
452
+
453
+ ```ts
454
+ protected resolveUserId(req: Request): string;
455
+
456
+ ```
457
+
458
+ Resolve the effective user ID from a request.
459
+
460
+ Returns the `x-forwarded-user` header when present. In development mode (`NODE_ENV=development`) falls back to the current context user ID so that callers outside an active `runInUserContext` scope still get a consistent value.
461
+
462
+ #### Parameters[​](#parameters-6 "Direct link to Parameters")
463
+
464
+ | Parameter | Type |
465
+ | --------- | --------- |
466
+ | `req` | `Request` |
467
+
468
+ #### Returns[​](#returns-10 "Direct link to Returns")
469
+
470
+ `string`
471
+
472
+ #### Throws[​](#throws-1 "Direct link to Throws")
473
+
474
+ AuthenticationError in production when no user header is present.
475
+
476
+ ***
477
+
430
478
  ### route()[​](#route "Direct link to route()")
431
479
 
432
480
  ```ts
@@ -440,14 +488,14 @@ protected route<_TResponse>(router: Router, config: RouteConfig): void;
440
488
  | -------------- |
441
489
  | `_TResponse` |
442
490
 
443
- #### Parameters[​](#parameters-6 "Direct link to Parameters")
491
+ #### Parameters[​](#parameters-7 "Direct link to Parameters")
444
492
 
445
493
  | Parameter | Type |
446
494
  | --------- | ------------- |
447
495
  | `router` | `Router` |
448
496
  | `config` | `RouteConfig` |
449
497
 
450
- #### Returns[​](#returns-9 "Direct link to Returns")
498
+ #### Returns[​](#returns-11 "Direct link to Returns")
451
499
 
452
500
  `void`
453
501
 
@@ -460,11 +508,11 @@ setup(): Promise<void>;
460
508
 
461
509
  ```
462
510
 
463
- #### Returns[​](#returns-10 "Direct link to Returns")
511
+ #### Returns[​](#returns-12 "Direct link to Returns")
464
512
 
465
513
  `Promise`<`void`>
466
514
 
467
- #### Implementation of[​](#implementation-of-5 "Direct link to Implementation of")
515
+ #### Implementation of[​](#implementation-of-6 "Direct link to Implementation of")
468
516
 
469
517
  ```ts
470
518
  BasePlugin.setup
@@ -43,9 +43,9 @@ Collects and registers resource requirements from an array of plugins. For each
43
43
 
44
44
  #### Parameters[​](#parameters "Direct link to Parameters")
45
45
 
46
- | Parameter | Type | Description |
47
- | ------------ | --------------------------------------------------------- | --------------------------------------------------------- |
48
- | `rawPlugins` | `PluginData`<`PluginConstructor`, `unknown`, `string`>\[] | Array of plugin data entries from createApp configuration |
46
+ | Parameter | Type | Description |
47
+ | ------------ | ------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------- |
48
+ | `rawPlugins` | [`PluginData`](./docs/api/appkit/TypeAlias.PluginData.md)<`PluginConstructor`, `unknown`, `string`>\[] | Array of plugin data entries from createApp configuration |
49
49
 
50
50
  #### Returns[​](#returns-2 "Direct link to Returns")
51
51
 
@@ -16,9 +16,9 @@ Initializes telemetry, cache, and service context, then registers plugins in pha
16
16
 
17
17
  ## Type Parameters[​](#type-parameters "Direct link to Type Parameters")
18
18
 
19
- | Type Parameter |
20
- | ----------------------------------------------------------------------- |
21
- | `T` *extends* `PluginData`<`PluginConstructor`, `unknown`, `string`>\[] |
19
+ | Type Parameter |
20
+ | -------------------------------------------------------------------------------------------------------------------------- |
21
+ | `T` *extends* [`PluginData`](./docs/api/appkit/TypeAlias.PluginData.md)<`PluginConstructor`, `unknown`, `string`>\[] |
22
22
 
23
23
  ## Parameters[​](#parameters "Direct link to Parameters")
24
24