@flexkit/studio 0.2.2 → 0.2.3
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/activity-nav-button-Z6M3FURW.js +2 -0
- package/dist/activity-nav-button-Z6M3FURW.js.map +1 -0
- package/dist/chat-page-J7I5V6G4.js +4 -0
- package/dist/{chat-page-YWENJEUP.js.map → chat-page-J7I5V6G4.js.map} +1 -1
- package/dist/chunk-32ZU4MLE.js +2 -0
- package/dist/{chunk-ODORXGGY.js.map → chunk-32ZU4MLE.js.map} +1 -1
- package/dist/chunk-3C2EG3SI.js +2 -0
- package/dist/{chunk-GW37ZTR2.js.map → chunk-3C2EG3SI.js.map} +1 -1
- package/dist/chunk-6NRQMG26.js +2 -0
- package/dist/chunk-6NRQMG26.js.map +1 -0
- package/dist/chunk-72TZUR4Q.js +2 -0
- package/dist/{chunk-4BX7OJJ6.js.map → chunk-72TZUR4Q.js.map} +1 -1
- package/dist/chunk-76CL7HSO.js +3 -0
- package/dist/chunk-76CL7HSO.js.map +1 -0
- package/dist/chunk-AN4APNXO.js +2 -0
- package/dist/chunk-AN4APNXO.js.map +1 -0
- package/dist/chunk-BP27UNNR.js +2 -0
- package/dist/{chunk-OFLU53AC.js.map → chunk-BP27UNNR.js.map} +1 -1
- package/dist/{chunk-7ZDMZVDA.js → chunk-G74PT7Z7.js} +5 -5
- package/dist/{chunk-7ZDMZVDA.js.map → chunk-G74PT7Z7.js.map} +1 -1
- package/dist/{chunk-Z6IEBNKV.js → chunk-IAA4CEBW.js} +2 -2
- package/dist/{chunk-Z6IEBNKV.js.map → chunk-IAA4CEBW.js.map} +1 -1
- package/dist/{chunk-2FQWBOU6.js → chunk-K7FD54PW.js} +6 -6
- package/dist/chunk-K7FD54PW.js.map +1 -0
- package/dist/chunk-MM356YIK.js +3 -0
- package/dist/chunk-MM356YIK.js.map +1 -0
- package/dist/chunk-MPLNRUP3.js +4 -0
- package/dist/{chunk-3FIKCGSP.js.map → chunk-MPLNRUP3.js.map} +1 -1
- package/dist/chunk-QDXGSL5B.js +2 -0
- package/dist/chunk-QDXGSL5B.js.map +1 -0
- package/dist/{chunk-LYGHDJ5A.js → chunk-QJDD73JR.js} +2 -2
- package/dist/{chunk-LYGHDJ5A.js.map → chunk-QJDD73JR.js.map} +1 -1
- package/dist/chunk-TWMX2IQ2.js +3 -0
- package/dist/chunk-TWMX2IQ2.js.map +1 -0
- package/dist/chunk-U45E5X3H.js +2 -0
- package/dist/chunk-U45E5X3H.js.map +1 -0
- package/dist/chunk-USNXQOMJ.js +2 -0
- package/dist/chunk-USNXQOMJ.js.map +1 -0
- package/dist/chunk-YCCFUGWJ.js +7 -0
- package/dist/chunk-YCCFUGWJ.js.map +1 -0
- package/dist/index.css +22 -0
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/list-IBUZ2LXU.js +2 -0
- package/dist/{list-3K2PBGML.js.map → list-IBUZ2LXU.js.map} +1 -1
- package/dist/logo-JAWR6P43.js +2 -0
- package/dist/logo-JAWR6P43.js.map +1 -0
- package/dist/pages-ZKDDV5T3.js +3 -0
- package/dist/pages-ZKDDV5T3.js.map +1 -0
- package/dist/plugin-pages-HQPZQSZT.js +2 -0
- package/dist/{plugin-pages-Q77CBW45.js.map → plugin-pages-HQPZQSZT.js.map} +1 -1
- package/dist/root-4UVGZZRU.js +2 -0
- package/dist/{root-4TME2KMP.js.map → root-4UVGZZRU.js.map} +1 -1
- package/dist/{root-4ZVGVCYY.js → root-HUJPHUHL.js} +10 -10
- package/dist/{root-4ZVGVCYY.js.map → root-HUJPHUHL.js.map} +1 -1
- package/dist/root-XGNAKO5P.js +2 -0
- package/dist/root-XGNAKO5P.js.map +1 -0
- package/dist/root-ZY2HGDBT.js +31 -0
- package/dist/{root-EZWV5VA4.js.map → root-ZY2HGDBT.js.map} +1 -1
- package/dist/search-N7G6BVN6.js +2 -0
- package/dist/{search-7NX232AW.js.map → search-N7G6BVN6.js.map} +1 -1
- package/dist/skills-pages-VP32HFUN.js +2 -0
- package/dist/{skills-pages-SMJ4EWZW.js.map → skills-pages-VP32HFUN.js.map} +1 -1
- package/dist/spec-renderer-EX7SCFWH.js +2 -0
- package/dist/{spec-renderer-5YGDRF52.js.map → spec-renderer-EX7SCFWH.js.map} +1 -1
- package/dist/ui.js +1 -1
- package/dist/user-nav-QZTYBG45.js +2 -0
- package/dist/user-nav-QZTYBG45.js.map +1 -0
- package/package.json +3 -3
- package/dist/chat-page-YWENJEUP.js +0 -4
- package/dist/chunk-2FQWBOU6.js.map +0 -1
- package/dist/chunk-3FIKCGSP.js +0 -4
- package/dist/chunk-4BX7OJJ6.js +0 -2
- package/dist/chunk-5DHOBLAE.js +0 -2
- package/dist/chunk-5DHOBLAE.js.map +0 -1
- package/dist/chunk-66N44IKJ.js +0 -3
- package/dist/chunk-66N44IKJ.js.map +0 -1
- package/dist/chunk-GW37ZTR2.js +0 -2
- package/dist/chunk-H6TOYVW2.js +0 -3
- package/dist/chunk-H6TOYVW2.js.map +0 -1
- package/dist/chunk-ODORXGGY.js +0 -2
- package/dist/chunk-OFLU53AC.js +0 -2
- package/dist/chunk-YIGEER6B.js +0 -7
- package/dist/chunk-YIGEER6B.js.map +0 -1
- package/dist/list-3K2PBGML.js +0 -2
- package/dist/logo-MU7MGYDH.js +0 -3
- package/dist/logo-MU7MGYDH.js.map +0 -1
- package/dist/pages-BDZ4ZXBS.js +0 -3
- package/dist/pages-BDZ4ZXBS.js.map +0 -1
- package/dist/plugin-pages-Q77CBW45.js +0 -2
- package/dist/root-4TME2KMP.js +0 -2
- package/dist/root-EZWV5VA4.js +0 -31
- package/dist/root-YKNISFWH.js +0 -2
- package/dist/root-YKNISFWH.js.map +0 -1
- package/dist/search-7NX232AW.js +0 -2
- package/dist/skills-pages-SMJ4EWZW.js +0 -2
- package/dist/spec-renderer-5YGDRF52.js +0 -2
- package/dist/user-nav-QZFCICK3.js +0 -2
- package/dist/user-nav-QZFCICK3.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/ai/spec-renderer.tsx"],"names":["cardMaxWidthClasses","Card","children","element","props","maxWidthClass","centeredClass","jsxs","jsx","stackGapClasses","stackAlignClasses","stackJustifyClasses","Stack","directionClass","gapClass","alignClass","justifyClass","gridColumnClasses","gridGapClasses","Grid","columnClass","Separator","headingClasses","Heading","level","textClasses","Text","BadgeComponent","Badge","AlertIcon","type","CheckCircle2Icon","AlertTriangleIcon","XCircleIcon","InfoIcon","Alert","typeClass","Table","columns","rows","row","TableCaption","TableHeader","TableRow","column","index","TableHead","TableBody","rowIndex","cell","cellIndex","TableCell","Progress","max","percent","Skeleton","LinkComponent","ExternalLink","Image","Accordion","item","Tabs","tabs","TabsList","tab","TabsTrigger","TabContent","TabsContent","trendClasses","TrendIcon","trend","TrendingUpIcon","TrendingDownIcon","MinusIcon","Metric","calloutClasses","CalloutIcon","LightbulbIcon","OctagonAlertIcon","Callout","timelineDotClasses","Timeline","items","CHART_COLORS","chartTooltipStyle","chartTooltipItemStyle","chartTooltipLabelStyle","chartTick","toNumber","value","parsed","getChartPoints","data","groups","key","group","x","ChartFrame","height","title","ResponsiveContainer","BarChart","points","color","RechartsBarChart","CartesianGrid","XAxis","YAxis","RechartsTooltip","Bar","LineChart","RechartsLineChart","Line","PieChart","slices","RechartsPieChart","Pie","slice","Cell","Mermaid","chart","diagramId","useId","svg","setSvg","useState","error","setError","useEffect","isCancelled","mermaid","isDark","result","renderError","registry","fallback","getSanitizedChildren","childKeys","elements","seen","childKey","normalizedKey","haveChildrenChanged","original","sanitized","sanitizeSpec","spec","hasChanged","elementKey","elementChildren","hasChildrenChanged","SPEC_DATA_PART_TYPE","dedupeSpecParts","parts","seenPatchLines","deduped","part","payload","line","RunSpecPart","useMemo","builtSpec","buildSpecFromParts","stateKey","StateProvider","VisibilityProvider","ActionProvider","Renderer"],"mappings":"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","file":"spec-renderer-5YGDRF52.js","sourcesContent":["import type { JSX } from 'react';\nimport type { ComponentRegistry, ComponentRenderer, Spec } from '@json-render/react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport { ActionProvider, Renderer, StateProvider, VisibilityProvider, buildSpecFromParts } from '@json-render/react';\nimport {\n AlertTriangleIcon,\n CheckCircle2Icon,\n InfoIcon,\n LightbulbIcon,\n MinusIcon,\n OctagonAlertIcon,\n TrendingDownIcon,\n TrendingUpIcon,\n XCircleIcon,\n} from 'lucide-react';\nimport {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Cell,\n Line,\n LineChart as RechartsLineChart,\n Pie,\n PieChart as RechartsPieChart,\n ResponsiveContainer,\n Tooltip as RechartsTooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport {\n Badge,\n ExternalLink,\n Separator as SeparatorPrimitive,\n Skeleton as SkeletonPrimitive,\n Table as TablePrimitive,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs as TabsPrimitive,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '../../ui';\n\n// ---------------------------------------------------------------------------\n// Layout components\n// ---------------------------------------------------------------------------\n\ninterface CardProps {\n centered: boolean | null;\n className: string | null;\n description: string | null;\n maxWidth: 'sm' | 'md' | 'lg' | 'full' | null;\n title: string | null;\n}\n\nconst cardMaxWidthClasses = {\n sm: 'fk:max-w-sm',\n md: 'fk:max-w-md',\n lg: 'fk:max-w-lg',\n full: 'fk:max-w-full',\n};\n\nconst Card: ComponentRenderer<CardProps> = ({ children, element }) => {\n const { props } = element;\n const maxWidthClass = props.maxWidth ? cardMaxWidthClasses[props.maxWidth] : '';\n const centeredClass = props.centered ? 'fk:mx-auto' : '';\n\n return (\n <div\n className={`fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:gap-2 fk:flex fk:flex-col ${maxWidthClass} ${centeredClass} ${props.className ?? ''} fk:corner-squircle`}\n >\n {props.title && <div className=\"fk:text-sm fk:font-medium\">{props.title}</div>}\n {props.description && <div className=\"fk:mt-0.5 fk:text-xs fk:text-muted-foreground\">{props.description}</div>}\n {(props.title ?? props.description) && children ? <div className=\"fk:mt-3\" /> : null}\n {children}\n </div>\n );\n};\n\ninterface StackProps {\n align: 'start' | 'center' | 'end' | 'stretch' | null;\n className: string | null;\n direction: 'horizontal' | 'vertical' | null;\n gap: 'none' | 'sm' | 'md' | 'lg' | 'xl' | null;\n justify: 'start' | 'center' | 'end' | 'between' | 'around' | null;\n}\n\nconst stackGapClasses = {\n none: 'fk:gap-0',\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst stackAlignClasses = {\n start: 'fk:items-start',\n center: 'fk:items-center',\n end: 'fk:items-end',\n stretch: 'fk:items-stretch',\n};\n\nconst stackJustifyClasses = {\n start: 'fk:justify-start',\n center: 'fk:justify-center',\n end: 'fk:justify-end',\n between: 'fk:justify-between',\n around: 'fk:justify-around',\n};\n\nconst Stack: ComponentRenderer<StackProps> = ({ children, element }) => {\n const { props } = element;\n const directionClass = props.direction === 'horizontal' ? 'fk:flex-row fk:flex-wrap' : 'fk:flex-col';\n const gapClass = stackGapClasses[props.gap ?? 'md'];\n const alignClass = props.align ? stackAlignClasses[props.align] : '';\n const justifyClass = props.justify ? stackJustifyClasses[props.justify] : '';\n\n return (\n <div\n className={`fk:flex fk:w-full ${directionClass} ${gapClass} ${alignClass} ${justifyClass} ${props.className ?? ''}`}\n >\n {children}\n </div>\n );\n};\n\ninterface GridProps {\n className: string | null;\n columns: number | null;\n gap: 'sm' | 'md' | 'lg' | 'xl' | null;\n}\n\nconst gridColumnClasses: { [columns: number]: string } = {\n 1: 'fk:grid-cols-1',\n 2: 'fk:grid-cols-2',\n 3: 'fk:grid-cols-3',\n 4: 'fk:grid-cols-4',\n 5: 'fk:grid-cols-5',\n 6: 'fk:grid-cols-6',\n};\n\nconst gridGapClasses = {\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst Grid: ComponentRenderer<GridProps> = ({ children, element }) => {\n const { props } = element;\n const columnClass = gridColumnClasses[props.columns ?? 1] ?? 'fk:grid-cols-1';\n const gapClass = gridGapClasses[props.gap ?? 'md'];\n\n return <div className={`fk:grid fk:w-full ${columnClass} ${gapClass} ${props.className ?? ''}`}>{children}</div>;\n};\n\nconst Separator: ComponentRenderer<{ orientation: 'horizontal' | 'vertical' | null }> = ({ element }) => (\n <SeparatorPrimitive orientation={element.props.orientation ?? 'horizontal'} />\n);\n\n// ---------------------------------------------------------------------------\n// Typography and content components\n// ---------------------------------------------------------------------------\n\ninterface HeadingProps {\n level: 'h1' | 'h2' | 'h3' | 'h4' | null;\n text: string;\n}\n\nconst headingClasses = {\n h1: 'fk:text-xl fk:font-semibold fk:tracking-tight',\n h2: 'fk:text-lg fk:font-semibold fk:tracking-tight',\n h3: 'fk:text-base fk:font-medium',\n h4: 'fk:text-sm fk:font-medium',\n};\n\nconst Heading: ComponentRenderer<HeadingProps> = ({ element }) => {\n const level = element.props.level ?? 'h2';\n const HeadingTag = level;\n\n return <HeadingTag className={headingClasses[level]}>{element.props.text}</HeadingTag>;\n};\n\ninterface TextProps {\n text: string;\n variant: 'body' | 'muted' | 'caption' | 'lead' | 'code' | null;\n}\n\nconst textClasses = {\n body: 'fk:text-sm',\n muted: 'fk:text-sm fk:text-muted-foreground',\n caption: 'fk:text-xs fk:text-muted-foreground',\n lead: 'fk:text-base',\n code: 'fk:rounded fk:bg-muted fk:px-1 fk:py-0.5 fk:font-mono fk:text-xs fk:corner-squircle',\n};\n\nconst Text: ComponentRenderer<TextProps> = ({ element }) => (\n <p className={textClasses[element.props.variant ?? 'body']}>{element.props.text}</p>\n);\n\ninterface BadgeProps {\n text: string;\n variant: 'default' | 'secondary' | 'destructive' | 'outline' | null;\n}\n\nconst BadgeComponent: ComponentRenderer<BadgeProps> = ({ element }) => (\n <Badge variant={element.props.variant ?? 'default'}>{element.props.text}</Badge>\n);\n\ninterface AlertProps {\n message: string | null;\n title: string;\n type: 'success' | 'info' | 'warning' | 'error' | null;\n}\n\nfunction AlertIcon({ type }: { type: AlertProps['type'] }): JSX.Element {\n switch (type) {\n case 'success':\n return <CheckCircle2Icon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'error':\n return <XCircleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n }\n}\n\nconst Alert: ComponentRenderer<AlertProps> = ({ element }) => {\n const { props } = element;\n const typeClass = props.type === 'error' ? 'fk:border-destructive/50 fk:text-destructive' : 'fk:text-foreground';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:bg-card fk:px-4 fk:py-3 fk:text-sm ${typeClass} fk:corner-squircle`}\n role=\"alert\"\n >\n <AlertIcon type={props.type} />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:font-medium\">{props.title}</div>\n {props.message && <div className=\"fk:text-muted-foreground\">{props.message}</div>}\n </div>\n </div>\n );\n};\n\ninterface TableProps {\n caption: string | null;\n columns: string[];\n rows: string[][];\n}\n\nconst Table: ComponentRenderer<TableProps> = ({ element }) => {\n const columns = element.props.columns ?? [];\n const rows = (element.props.rows ?? []).map((row) => row.map(String));\n\n return (\n <div className=\"fk:w-full fk:overflow-hidden fk:rounded-md fk:mt-2 fk:corner-squircle\">\n <TablePrimitive>\n {element.props.caption && <TableCaption>{element.props.caption}</TableCaption>}\n <TableHeader>\n <TableRow>\n {columns.map((column, index) => (\n <TableHead key={`${index.toString()}-${column}`}>{column}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <TableCell key={cellIndex}>{cell}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </TablePrimitive>\n </div>\n );\n};\n\ninterface ProgressProps {\n label: string | null;\n max: number | null;\n value: number;\n}\n\nconst Progress: ComponentRenderer<ProgressProps> = ({ element }) => {\n const { props } = element;\n const max = props.max ?? 100;\n const percent = max > 0 ? Math.min(100, Math.max(0, (props.value / max) * 100)) : 0;\n\n return (\n <div className=\"fk:w-full\">\n {props.label && (\n <div className=\"fk:mb-1 fk:flex fk:items-center fk:justify-between fk:text-xs fk:text-muted-foreground\">\n <span>{props.label}</span>\n <span className=\"fk:tabular-nums\">{Math.round(percent)}%</span>\n </div>\n )}\n <div className=\"fk:h-2 fk:w-full fk:overflow-hidden fk:rounded-full fk:bg-secondary fk:corner-squircle\">\n <div className=\"fk:h-full fk:rounded-full fk:bg-primary fk:corner-squircle\" style={{ width: `${percent.toString()}%` }} />\n </div>\n </div>\n );\n};\n\nconst Skeleton: ComponentRenderer<{ height: string | null; rounded: boolean | null; width: string | null }> = ({\n element,\n}) => (\n <SkeletonPrimitive\n className={element.props.rounded ? 'fk:rounded-full fk:corner-squircle' : ''}\n style={{ height: element.props.height ?? '1rem', width: element.props.width ?? '100%' }}\n />\n);\n\nconst LinkComponent: ComponentRenderer<{ href: string; label: string }> = ({ element }) => (\n <ExternalLink href={element.props.href}>{element.props.label}</ExternalLink>\n);\n\nconst Image: ComponentRenderer<{\n alt: string;\n height: number | null;\n src: string | null;\n width: number | null;\n}> = ({ element }) => {\n if (!element.props.src) {\n return null;\n }\n\n return (\n <img\n alt={element.props.alt}\n className=\"fk:max-w-full fk:rounded-md fk:corner-squircle\"\n height={element.props.height ?? undefined}\n src={element.props.src}\n width={element.props.width ?? undefined}\n />\n );\n};\n\ninterface AccordionProps {\n items: { content: string; title: string }[];\n type: 'single' | 'multiple' | null;\n}\n\nconst Accordion: ComponentRenderer<AccordionProps> = ({ element }) => (\n <div className=\"fk:w-full fk:divide-y fk:divide-border fk:rounded-md fk:border fk:border-border fk:corner-squircle\">\n {(element.props.items ?? []).map((item, index) => (\n <details className=\"fk:group fk:px-4 fk:py-3\" key={index}>\n <summary className=\"fk:cursor-pointer fk:list-none fk:text-sm fk:font-medium\">{item.title}</summary>\n <p className=\"fk:mt-2 fk:text-sm fk:text-muted-foreground\">{item.content}</p>\n </details>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\ninterface TabsProps {\n defaultValue: string | null;\n tabs: { label: string; value: string }[];\n value: string | null;\n}\n\nconst Tabs: ComponentRenderer<TabsProps> = ({ children, element }) => {\n const tabs = element.props.tabs ?? [];\n\n return (\n <TabsPrimitive defaultValue={element.props.value ?? element.props.defaultValue ?? tabs[0]?.value}>\n <TabsList>\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {children}\n </TabsPrimitive>\n );\n};\n\nconst TabContent: ComponentRenderer<{ value: string }> = ({ children, element }) => (\n <TabsContent value={element.props.value}>{children}</TabsContent>\n);\n\n// ---------------------------------------------------------------------------\n// Result-focused components (Metric, Callout, Timeline)\n// ---------------------------------------------------------------------------\n\ninterface MetricProps {\n detail: string | null;\n label: string;\n trend: 'up' | 'down' | 'neutral' | null;\n value: string;\n}\n\nconst trendClasses = {\n up: 'fk:text-success',\n down: 'fk:text-destructive',\n neutral: 'fk:text-muted-foreground',\n};\n\nfunction TrendIcon({ trend }: { trend: 'up' | 'down' | 'neutral' }): JSX.Element {\n if (trend === 'up') {\n return <TrendingUpIcon className=\"fk:size-4\" />;\n }\n\n if (trend === 'down') {\n return <TrendingDownIcon className=\"fk:size-4\" />;\n }\n\n return <MinusIcon className=\"fk:size-4\" />;\n}\n\nconst Metric: ComponentRenderer<MetricProps> = ({ element }) => {\n const { props } = element;\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle\">\n <div className=\"fk:text-xs fk:font-medium fk:text-muted-foreground\">{props.label}</div>\n <div className=\"fk:mt-1 fk:flex fk:items-center fk:gap-2\">\n <span className=\"fk:text-2xl fk:font-semibold fk:tabular-nums fk:tracking-tight\">{props.value}</span>\n {props.trend && (\n <span className={trendClasses[props.trend]}>\n <TrendIcon trend={props.trend} />\n </span>\n )}\n </div>\n {props.detail && <div className=\"fk:mt-1 fk:text-xs fk:text-muted-foreground\">{props.detail}</div>}\n </div>\n );\n};\n\ninterface CalloutProps {\n content: string;\n title: string | null;\n type: 'info' | 'tip' | 'warning' | 'important' | null;\n}\n\nconst calloutClasses = {\n info: 'fk:border-blue-500/30 fk:bg-blue-500/5 fk:text-blue-700 fk:dark:text-blue-400',\n tip: 'fk:border-emerald-500/30 fk:bg-emerald-500/5 fk:text-emerald-700 fk:dark:text-emerald-400',\n warning: 'fk:border-amber-500/30 fk:bg-amber-500/5 fk:text-amber-700 fk:dark:text-amber-400',\n important: 'fk:border-red-500/30 fk:bg-red-500/5 fk:text-red-700 fk:dark:text-red-400',\n};\n\nfunction CalloutIcon({ type }: { type: 'info' | 'tip' | 'warning' | 'important' }): JSX.Element {\n switch (type) {\n case 'tip':\n return <LightbulbIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'important':\n return <OctagonAlertIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n }\n}\n\nconst Callout: ComponentRenderer<CalloutProps> = ({ element }) => {\n const { props } = element;\n const type = props.type ?? 'info';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:px-4 fk:py-3 fk:text-sm ${calloutClasses[type]} fk:corner-squircle`}\n >\n <CalloutIcon type={type} />\n <div className=\"fk:min-w-0\">\n {props.title && <div className=\"fk:font-medium\">{props.title}</div>}\n <div className=\"fk:text-foreground\">{props.content}</div>\n </div>\n </div>\n );\n};\n\ninterface TimelineProps {\n items: {\n date: string | null;\n description: string | null;\n status: 'completed' | 'current' | 'upcoming' | null;\n title: string;\n }[];\n}\n\nconst timelineDotClasses = {\n completed: 'fk:border-success fk:bg-success',\n current: 'fk:border-primary fk:bg-primary',\n upcoming: 'fk:border-border fk:bg-background',\n};\n\nconst Timeline: ComponentRenderer<TimelineProps> = ({ element }) => (\n <div className=\"fk:w-full\">\n {(element.props.items ?? []).map((item, index, items) => (\n <div className=\"fk:relative fk:flex fk:gap-3 fk:pb-4 fk:last:pb-0\" key={index}>\n {index < items.length - 1 && (\n <div className=\"fk:absolute fk:left-[5px] fk:top-4 fk:h-full fk:w-px fk:bg-border\" />\n )}\n <div\n className={`fk:mt-1 fk:size-[11px] fk:shrink-0 fk:rounded-full fk:border-2 ${timelineDotClasses[item.status ?? 'upcoming']} fk:corner-squircle`}\n />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:flex fk:flex-wrap fk:items-baseline fk:gap-x-2\">\n <span className=\"fk:text-sm fk:font-medium\">{item.title}</span>\n {item.date && <span className=\"fk:text-xs fk:text-muted-foreground\">{item.date}</span>}\n </div>\n {item.description && <div className=\"fk:text-sm fk:text-muted-foreground\">{item.description}</div>}\n </div>\n </div>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Charts\n// ---------------------------------------------------------------------------\n\nconst CHART_COLORS = ['#6366f1', '#10b981', '#f59e0b', '#ef4444', '#06b6d4'];\n\nconst chartTooltipStyle = {\n background: 'hsl(var(--background))',\n border: '1px solid hsl(var(--border))',\n borderRadius: 6,\n color: 'hsl(var(--foreground))',\n fontSize: 12,\n};\n\nconst chartTooltipItemStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTooltipLabelStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTick = { fill: 'hsl(var(--muted-foreground))', fontSize: 11 };\n\ninterface ChartPoint {\n x: string;\n y: number;\n}\n\ninterface CartesianChartProps {\n aggregate: 'sum' | 'count' | 'avg' | null;\n color: string | null;\n data: { [key: string]: unknown }[];\n height: number | null;\n title: string | null;\n xKey: string;\n yKey: string;\n}\n\nfunction toNumber(value: unknown): number {\n const parsed = typeof value === 'number' ? value : Number(value);\n\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction getChartPoints(props: CartesianChartProps): ChartPoint[] {\n const data = props.data ?? [];\n\n if (!props.aggregate) {\n return data.map((row) => ({\n x: String(row[props.xKey] ?? ''),\n y: toNumber(row[props.yKey]),\n }));\n }\n\n const groups = new Map<string, { count: number; sum: number }>();\n\n for (const row of data) {\n const key = String(row[props.xKey] ?? '');\n const group = groups.get(key) ?? { count: 0, sum: 0 };\n\n group.count += 1;\n group.sum += toNumber(row[props.yKey]);\n groups.set(key, group);\n }\n\n return Array.from(groups.entries()).map(([x, group]) => {\n if (props.aggregate === 'count') {\n return { x, y: group.count };\n }\n\n if (props.aggregate === 'avg') {\n return { x, y: group.count === 0 ? 0 : group.sum / group.count };\n }\n\n return { x, y: group.sum };\n });\n}\n\nfunction ChartFrame({\n children,\n height,\n title,\n}: {\n children: JSX.Element;\n height: number | null;\n title: string | null;\n}): JSX.Element {\n return (\n <div className=\"fk:w-full\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n <div style={{ height: height ?? 256 }}>\n <ResponsiveContainer height=\"100%\" width=\"100%\">\n {children}\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nconst BarChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsBarChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n cursor={{ fill: 'hsl(var(--muted))' }}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Bar dataKey=\"y\" fill={color} isAnimationActive={false} name={element.props.yKey} radius={4} />\n </RechartsBarChart>\n </ChartFrame>\n );\n};\n\nconst LineChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsLineChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Line\n dataKey=\"y\"\n dot={false}\n isAnimationActive={false}\n name={element.props.yKey}\n stroke={color}\n strokeWidth={2}\n type=\"monotone\"\n />\n </RechartsLineChart>\n </ChartFrame>\n );\n};\n\ninterface PieChartProps {\n data: { [key: string]: unknown }[];\n height: number | null;\n nameKey: string;\n title: string | null;\n valueKey: string;\n}\n\nconst PieChart: ComponentRenderer<PieChartProps> = ({ element }) => {\n const slices = (element.props.data ?? []).map((row) => ({\n name: String(row[element.props.nameKey] ?? ''),\n value: toNumber(row[element.props.valueKey]),\n }));\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsPieChart>\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Pie data={slices} dataKey=\"value\" innerRadius=\"45%\" isAnimationActive={false} nameKey=\"name\">\n {slices.map((slice, index) => (\n <Cell fill={CHART_COLORS[index % CHART_COLORS.length]} key={`${slice.name}-${index.toString()}`} />\n ))}\n </Pie>\n </RechartsPieChart>\n </ChartFrame>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Mermaid\n// ---------------------------------------------------------------------------\n\ninterface MermaidProps {\n chart: string;\n title: string | null;\n}\n\nconst Mermaid: ComponentRenderer<MermaidProps> = ({ element }) => {\n const { chart, title } = element.props;\n const diagramId = useId().replace(/[^a-zA-Z0-9]/g, '');\n const [svg, setSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n const render = async (): Promise<void> => {\n try {\n const { default: mermaid } = await import('mermaid');\n const isDark = document.documentElement.classList.contains('dark');\n\n mermaid.initialize({ securityLevel: 'strict', startOnLoad: false, theme: isDark ? 'dark' : 'default' });\n\n const result = await mermaid.render(`fk-mermaid-${diagramId}`, chart);\n\n if (!isCancelled) {\n setSvg(result.svg);\n setError(null);\n }\n } catch (renderError) {\n if (!isCancelled) {\n setError(renderError instanceof Error ? renderError.message : 'Failed to render the diagram.');\n }\n }\n };\n\n void render();\n\n return () => {\n isCancelled = true;\n };\n }, [chart, diagramId]);\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n {error ? (\n <pre className=\"fk:overflow-x-auto fk:whitespace-pre-wrap fk:text-xs fk:text-muted-foreground\">{chart}</pre>\n ) : null}\n {!error && svg ? (\n <div className=\"fk:flex fk:justify-center fk:overflow-x-auto\" dangerouslySetInnerHTML={{ __html: svg }} />\n ) : null}\n {!error && !svg ? <SkeletonPrimitive className=\"fk:h-40 fk:w-full\" /> : null}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Registry and spec rendering\n// ---------------------------------------------------------------------------\n\nconst registry: ComponentRegistry = {\n Accordion,\n Alert,\n Badge: BadgeComponent,\n BarChart,\n Callout,\n Card,\n Grid,\n Heading,\n Image,\n LineChart,\n Link: LinkComponent,\n Mermaid,\n Metric,\n PieChart,\n Progress,\n Separator,\n Skeleton,\n Stack,\n TabContent,\n Table,\n Tabs,\n Text,\n Timeline,\n};\n\nconst fallback: ComponentRenderer = ({ element }) => (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:border-border fk:p-3 fk:text-sm fk:text-muted-foreground fk:corner-squircle\">\n Unsupported component: {element.type}\n </div>\n);\n\nfunction getSanitizedChildren(childKeys: string[] | undefined, elements: Spec['elements']): string[] {\n const seen = new Set<string>();\n const children: string[] = [];\n\n for (const childKey of childKeys ?? []) {\n const normalizedKey = String(childKey);\n\n if (seen.has(normalizedKey) || !elements[normalizedKey]) {\n continue;\n }\n\n seen.add(normalizedKey);\n children.push(normalizedKey);\n }\n\n return children;\n}\n\nfunction haveChildrenChanged(original: string[], sanitized: string[]): boolean {\n if (original.length !== sanitized.length) {\n return true;\n }\n\n return sanitized.some((childKey, index) => childKey !== original[index]);\n}\n\nfunction sanitizeSpec(spec: Spec): Spec | null {\n if (!spec.elements[spec.root]) {\n return null;\n }\n\n let hasChanged = false;\n const elements: Spec['elements'] = {};\n\n for (const elementKey of Object.keys(spec.elements)) {\n const element = spec.elements[elementKey];\n\n if (!element) {\n continue;\n }\n\n const elementChildren = element.children ?? [];\n const children = getSanitizedChildren(elementChildren, spec.elements);\n const hasChildrenChanged = haveChildrenChanged(elementChildren, children);\n\n if (hasChildrenChanged) {\n hasChanged = true;\n }\n\n elements[elementKey] = hasChildrenChanged ? { ...element, children } : element;\n }\n\n if (!hasChanged) {\n return spec;\n }\n\n return { ...spec, elements };\n}\n\ninterface SpecMessagePart {\n data?: unknown;\n text?: string;\n type: string;\n}\n\nconst SPEC_DATA_PART_TYPE = 'data-spec';\n\nfunction dedupeSpecParts(parts: SpecMessagePart[]): SpecMessagePart[] {\n const seenPatchLines = new Set<string>();\n const deduped: SpecMessagePart[] = [];\n\n for (const part of parts) {\n if (part.type !== SPEC_DATA_PART_TYPE) {\n continue;\n }\n\n const payload = part.data;\n\n if (payload && typeof payload === 'object' && 'type' in payload && payload.type === 'patch' && 'patch' in payload) {\n const line = JSON.stringify(payload.patch);\n\n if (seenPatchLines.has(line)) {\n continue;\n }\n\n seenPatchLines.add(line);\n }\n\n deduped.push(part);\n }\n\n return deduped;\n}\n\nexport function RunSpecPart({ parts }: { parts: SpecMessagePart[] }): JSX.Element | null {\n const spec = useMemo(() => {\n const builtSpec = buildSpecFromParts(dedupeSpecParts(parts));\n\n return builtSpec ? sanitizeSpec(builtSpec) : null;\n }, [parts]);\n const stateKey = useMemo(() => JSON.stringify(spec?.state ?? {}), [spec]);\n\n if (!spec) {\n return null;\n }\n\n return (\n <StateProvider initialState={spec.state} key={stateKey}>\n <VisibilityProvider>\n <ActionProvider>\n <Renderer fallback={fallback} registry={registry} spec={spec} />\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\nexport type { SpecMessagePart };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/ai/spec-renderer.tsx"],"names":["cardMaxWidthClasses","Card","children","element","props","maxWidthClass","centeredClass","jsxs","jsx","stackGapClasses","stackAlignClasses","stackJustifyClasses","Stack","directionClass","gapClass","alignClass","justifyClass","gridColumnClasses","gridGapClasses","Grid","columnClass","Separator","headingClasses","Heading","level","textClasses","Text","BadgeComponent","Badge","AlertIcon","type","CheckCircle2Icon","AlertTriangleIcon","XCircleIcon","InfoIcon","Alert","typeClass","Table","columns","rows","row","TableCaption","TableHeader","TableRow","column","index","TableHead","TableBody","rowIndex","cell","cellIndex","TableCell","Progress","max","percent","Skeleton","LinkComponent","ExternalLink","Image","Accordion","item","Tabs","tabs","TabsList","tab","TabsTrigger","TabContent","TabsContent","trendClasses","TrendIcon","trend","TrendingUpIcon","TrendingDownIcon","MinusIcon","Metric","calloutClasses","CalloutIcon","LightbulbIcon","OctagonAlertIcon","Callout","timelineDotClasses","Timeline","items","CHART_COLORS","chartTooltipStyle","chartTooltipItemStyle","chartTooltipLabelStyle","chartTick","toNumber","value","parsed","getChartPoints","data","groups","key","group","x","ChartFrame","height","title","ResponsiveContainer","BarChart","points","color","RechartsBarChart","CartesianGrid","XAxis","YAxis","RechartsTooltip","Bar","LineChart","RechartsLineChart","Line","PieChart","slices","RechartsPieChart","Pie","slice","Cell","Mermaid","chart","diagramId","useId","svg","setSvg","useState","error","setError","useEffect","isCancelled","mermaid","isDark","result","renderError","registry","fallback","getSanitizedChildren","childKeys","elements","seen","childKey","normalizedKey","haveChildrenChanged","original","sanitized","sanitizeSpec","spec","hasChanged","elementKey","elementChildren","hasChildrenChanged","SPEC_DATA_PART_TYPE","dedupeSpecParts","parts","seenPatchLines","deduped","part","payload","line","RunSpecPart","useMemo","builtSpec","buildSpecFromParts","stateKey","StateProvider","VisibilityProvider","ActionProvider","Renderer"],"mappings":"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","file":"spec-renderer-EX7SCFWH.js","sourcesContent":["import type { JSX } from 'react';\nimport type { ComponentRegistry, ComponentRenderer, Spec } from '@json-render/react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport { ActionProvider, Renderer, StateProvider, VisibilityProvider, buildSpecFromParts } from '@json-render/react';\nimport {\n AlertTriangleIcon,\n CheckCircle2Icon,\n InfoIcon,\n LightbulbIcon,\n MinusIcon,\n OctagonAlertIcon,\n TrendingDownIcon,\n TrendingUpIcon,\n XCircleIcon,\n} from 'lucide-react';\nimport {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Cell,\n Line,\n LineChart as RechartsLineChart,\n Pie,\n PieChart as RechartsPieChart,\n ResponsiveContainer,\n Tooltip as RechartsTooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport {\n Badge,\n ExternalLink,\n Separator as SeparatorPrimitive,\n Skeleton as SkeletonPrimitive,\n Table as TablePrimitive,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs as TabsPrimitive,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '../../ui';\n\n// ---------------------------------------------------------------------------\n// Layout components\n// ---------------------------------------------------------------------------\n\ninterface CardProps {\n centered: boolean | null;\n className: string | null;\n description: string | null;\n maxWidth: 'sm' | 'md' | 'lg' | 'full' | null;\n title: string | null;\n}\n\nconst cardMaxWidthClasses = {\n sm: 'fk:max-w-sm',\n md: 'fk:max-w-md',\n lg: 'fk:max-w-lg',\n full: 'fk:max-w-full',\n};\n\nconst Card: ComponentRenderer<CardProps> = ({ children, element }) => {\n const { props } = element;\n const maxWidthClass = props.maxWidth ? cardMaxWidthClasses[props.maxWidth] : '';\n const centeredClass = props.centered ? 'fk:mx-auto' : '';\n\n return (\n <div\n className={`fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:gap-2 fk:flex fk:flex-col ${maxWidthClass} ${centeredClass} ${props.className ?? ''} fk:corner-squircle`}\n >\n {props.title && <div className=\"fk:text-sm fk:font-medium\">{props.title}</div>}\n {props.description && <div className=\"fk:mt-0.5 fk:text-xs fk:text-muted-foreground\">{props.description}</div>}\n {(props.title ?? props.description) && children ? <div className=\"fk:mt-3\" /> : null}\n {children}\n </div>\n );\n};\n\ninterface StackProps {\n align: 'start' | 'center' | 'end' | 'stretch' | null;\n className: string | null;\n direction: 'horizontal' | 'vertical' | null;\n gap: 'none' | 'sm' | 'md' | 'lg' | 'xl' | null;\n justify: 'start' | 'center' | 'end' | 'between' | 'around' | null;\n}\n\nconst stackGapClasses = {\n none: 'fk:gap-0',\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst stackAlignClasses = {\n start: 'fk:items-start',\n center: 'fk:items-center',\n end: 'fk:items-end',\n stretch: 'fk:items-stretch',\n};\n\nconst stackJustifyClasses = {\n start: 'fk:justify-start',\n center: 'fk:justify-center',\n end: 'fk:justify-end',\n between: 'fk:justify-between',\n around: 'fk:justify-around',\n};\n\nconst Stack: ComponentRenderer<StackProps> = ({ children, element }) => {\n const { props } = element;\n const directionClass = props.direction === 'horizontal' ? 'fk:flex-row fk:flex-wrap' : 'fk:flex-col';\n const gapClass = stackGapClasses[props.gap ?? 'md'];\n const alignClass = props.align ? stackAlignClasses[props.align] : '';\n const justifyClass = props.justify ? stackJustifyClasses[props.justify] : '';\n\n return (\n <div\n className={`fk:flex fk:w-full ${directionClass} ${gapClass} ${alignClass} ${justifyClass} ${props.className ?? ''}`}\n >\n {children}\n </div>\n );\n};\n\ninterface GridProps {\n className: string | null;\n columns: number | null;\n gap: 'sm' | 'md' | 'lg' | 'xl' | null;\n}\n\nconst gridColumnClasses: { [columns: number]: string } = {\n 1: 'fk:grid-cols-1',\n 2: 'fk:grid-cols-2',\n 3: 'fk:grid-cols-3',\n 4: 'fk:grid-cols-4',\n 5: 'fk:grid-cols-5',\n 6: 'fk:grid-cols-6',\n};\n\nconst gridGapClasses = {\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst Grid: ComponentRenderer<GridProps> = ({ children, element }) => {\n const { props } = element;\n const columnClass = gridColumnClasses[props.columns ?? 1] ?? 'fk:grid-cols-1';\n const gapClass = gridGapClasses[props.gap ?? 'md'];\n\n return <div className={`fk:grid fk:w-full ${columnClass} ${gapClass} ${props.className ?? ''}`}>{children}</div>;\n};\n\nconst Separator: ComponentRenderer<{ orientation: 'horizontal' | 'vertical' | null }> = ({ element }) => (\n <SeparatorPrimitive orientation={element.props.orientation ?? 'horizontal'} />\n);\n\n// ---------------------------------------------------------------------------\n// Typography and content components\n// ---------------------------------------------------------------------------\n\ninterface HeadingProps {\n level: 'h1' | 'h2' | 'h3' | 'h4' | null;\n text: string;\n}\n\nconst headingClasses = {\n h1: 'fk:text-xl fk:font-semibold fk:tracking-tight',\n h2: 'fk:text-lg fk:font-semibold fk:tracking-tight',\n h3: 'fk:text-base fk:font-medium',\n h4: 'fk:text-sm fk:font-medium',\n};\n\nconst Heading: ComponentRenderer<HeadingProps> = ({ element }) => {\n const level = element.props.level ?? 'h2';\n const HeadingTag = level;\n\n return <HeadingTag className={headingClasses[level]}>{element.props.text}</HeadingTag>;\n};\n\ninterface TextProps {\n text: string;\n variant: 'body' | 'muted' | 'caption' | 'lead' | 'code' | null;\n}\n\nconst textClasses = {\n body: 'fk:text-sm',\n muted: 'fk:text-sm fk:text-muted-foreground',\n caption: 'fk:text-xs fk:text-muted-foreground',\n lead: 'fk:text-base',\n code: 'fk:rounded fk:bg-muted fk:px-1 fk:py-0.5 fk:font-mono fk:text-xs fk:corner-squircle',\n};\n\nconst Text: ComponentRenderer<TextProps> = ({ element }) => (\n <p className={textClasses[element.props.variant ?? 'body']}>{element.props.text}</p>\n);\n\ninterface BadgeProps {\n text: string;\n variant: 'default' | 'secondary' | 'destructive' | 'outline' | null;\n}\n\nconst BadgeComponent: ComponentRenderer<BadgeProps> = ({ element }) => (\n <Badge variant={element.props.variant ?? 'default'}>{element.props.text}</Badge>\n);\n\ninterface AlertProps {\n message: string | null;\n title: string;\n type: 'success' | 'info' | 'warning' | 'error' | null;\n}\n\nfunction AlertIcon({ type }: { type: AlertProps['type'] }): JSX.Element {\n switch (type) {\n case 'success':\n return <CheckCircle2Icon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'error':\n return <XCircleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n }\n}\n\nconst Alert: ComponentRenderer<AlertProps> = ({ element }) => {\n const { props } = element;\n const typeClass = props.type === 'error' ? 'fk:border-destructive/50 fk:text-destructive' : 'fk:text-foreground';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:bg-card fk:px-4 fk:py-3 fk:text-sm ${typeClass} fk:corner-squircle`}\n role=\"alert\"\n >\n <AlertIcon type={props.type} />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:font-medium\">{props.title}</div>\n {props.message && <div className=\"fk:text-muted-foreground\">{props.message}</div>}\n </div>\n </div>\n );\n};\n\ninterface TableProps {\n caption: string | null;\n columns: string[];\n rows: string[][];\n}\n\nconst Table: ComponentRenderer<TableProps> = ({ element }) => {\n const columns = element.props.columns ?? [];\n const rows = (element.props.rows ?? []).map((row) => row.map(String));\n\n return (\n <div className=\"fk:w-full fk:overflow-hidden fk:rounded-md fk:mt-2 fk:corner-squircle\">\n <TablePrimitive>\n {element.props.caption && <TableCaption>{element.props.caption}</TableCaption>}\n <TableHeader>\n <TableRow>\n {columns.map((column, index) => (\n <TableHead key={`${index.toString()}-${column}`}>{column}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <TableCell key={cellIndex}>{cell}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </TablePrimitive>\n </div>\n );\n};\n\ninterface ProgressProps {\n label: string | null;\n max: number | null;\n value: number;\n}\n\nconst Progress: ComponentRenderer<ProgressProps> = ({ element }) => {\n const { props } = element;\n const max = props.max ?? 100;\n const percent = max > 0 ? Math.min(100, Math.max(0, (props.value / max) * 100)) : 0;\n\n return (\n <div className=\"fk:w-full\">\n {props.label && (\n <div className=\"fk:mb-1 fk:flex fk:items-center fk:justify-between fk:text-xs fk:text-muted-foreground\">\n <span>{props.label}</span>\n <span className=\"fk:tabular-nums\">{Math.round(percent)}%</span>\n </div>\n )}\n <div className=\"fk:h-2 fk:w-full fk:overflow-hidden fk:rounded-full fk:bg-secondary fk:corner-squircle\">\n <div className=\"fk:h-full fk:rounded-full fk:bg-primary fk:corner-squircle\" style={{ width: `${percent.toString()}%` }} />\n </div>\n </div>\n );\n};\n\nconst Skeleton: ComponentRenderer<{ height: string | null; rounded: boolean | null; width: string | null }> = ({\n element,\n}) => (\n <SkeletonPrimitive\n className={element.props.rounded ? 'fk:rounded-full fk:corner-squircle' : ''}\n style={{ height: element.props.height ?? '1rem', width: element.props.width ?? '100%' }}\n />\n);\n\nconst LinkComponent: ComponentRenderer<{ href: string; label: string }> = ({ element }) => (\n <ExternalLink href={element.props.href}>{element.props.label}</ExternalLink>\n);\n\nconst Image: ComponentRenderer<{\n alt: string;\n height: number | null;\n src: string | null;\n width: number | null;\n}> = ({ element }) => {\n if (!element.props.src) {\n return null;\n }\n\n return (\n <img\n alt={element.props.alt}\n className=\"fk:max-w-full fk:rounded-md fk:corner-squircle\"\n height={element.props.height ?? undefined}\n src={element.props.src}\n width={element.props.width ?? undefined}\n />\n );\n};\n\ninterface AccordionProps {\n items: { content: string; title: string }[];\n type: 'single' | 'multiple' | null;\n}\n\nconst Accordion: ComponentRenderer<AccordionProps> = ({ element }) => (\n <div className=\"fk:w-full fk:divide-y fk:divide-border fk:rounded-md fk:border fk:border-border fk:corner-squircle\">\n {(element.props.items ?? []).map((item, index) => (\n <details className=\"fk:group fk:px-4 fk:py-3\" key={index}>\n <summary className=\"fk:cursor-pointer fk:list-none fk:text-sm fk:font-medium\">{item.title}</summary>\n <p className=\"fk:mt-2 fk:text-sm fk:text-muted-foreground\">{item.content}</p>\n </details>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\ninterface TabsProps {\n defaultValue: string | null;\n tabs: { label: string; value: string }[];\n value: string | null;\n}\n\nconst Tabs: ComponentRenderer<TabsProps> = ({ children, element }) => {\n const tabs = element.props.tabs ?? [];\n\n return (\n <TabsPrimitive defaultValue={element.props.value ?? element.props.defaultValue ?? tabs[0]?.value}>\n <TabsList>\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {children}\n </TabsPrimitive>\n );\n};\n\nconst TabContent: ComponentRenderer<{ value: string }> = ({ children, element }) => (\n <TabsContent value={element.props.value}>{children}</TabsContent>\n);\n\n// ---------------------------------------------------------------------------\n// Result-focused components (Metric, Callout, Timeline)\n// ---------------------------------------------------------------------------\n\ninterface MetricProps {\n detail: string | null;\n label: string;\n trend: 'up' | 'down' | 'neutral' | null;\n value: string;\n}\n\nconst trendClasses = {\n up: 'fk:text-success',\n down: 'fk:text-destructive',\n neutral: 'fk:text-muted-foreground',\n};\n\nfunction TrendIcon({ trend }: { trend: 'up' | 'down' | 'neutral' }): JSX.Element {\n if (trend === 'up') {\n return <TrendingUpIcon className=\"fk:size-4\" />;\n }\n\n if (trend === 'down') {\n return <TrendingDownIcon className=\"fk:size-4\" />;\n }\n\n return <MinusIcon className=\"fk:size-4\" />;\n}\n\nconst Metric: ComponentRenderer<MetricProps> = ({ element }) => {\n const { props } = element;\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle\">\n <div className=\"fk:text-xs fk:font-medium fk:text-muted-foreground\">{props.label}</div>\n <div className=\"fk:mt-1 fk:flex fk:items-center fk:gap-2\">\n <span className=\"fk:text-2xl fk:font-semibold fk:tabular-nums fk:tracking-tight\">{props.value}</span>\n {props.trend && (\n <span className={trendClasses[props.trend]}>\n <TrendIcon trend={props.trend} />\n </span>\n )}\n </div>\n {props.detail && <div className=\"fk:mt-1 fk:text-xs fk:text-muted-foreground\">{props.detail}</div>}\n </div>\n );\n};\n\ninterface CalloutProps {\n content: string;\n title: string | null;\n type: 'info' | 'tip' | 'warning' | 'important' | null;\n}\n\nconst calloutClasses = {\n info: 'fk:border-blue-500/30 fk:bg-blue-500/5 fk:text-blue-700 fk:dark:text-blue-400',\n tip: 'fk:border-emerald-500/30 fk:bg-emerald-500/5 fk:text-emerald-700 fk:dark:text-emerald-400',\n warning: 'fk:border-amber-500/30 fk:bg-amber-500/5 fk:text-amber-700 fk:dark:text-amber-400',\n important: 'fk:border-red-500/30 fk:bg-red-500/5 fk:text-red-700 fk:dark:text-red-400',\n};\n\nfunction CalloutIcon({ type }: { type: 'info' | 'tip' | 'warning' | 'important' }): JSX.Element {\n switch (type) {\n case 'tip':\n return <LightbulbIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'important':\n return <OctagonAlertIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n }\n}\n\nconst Callout: ComponentRenderer<CalloutProps> = ({ element }) => {\n const { props } = element;\n const type = props.type ?? 'info';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:px-4 fk:py-3 fk:text-sm ${calloutClasses[type]} fk:corner-squircle`}\n >\n <CalloutIcon type={type} />\n <div className=\"fk:min-w-0\">\n {props.title && <div className=\"fk:font-medium\">{props.title}</div>}\n <div className=\"fk:text-foreground\">{props.content}</div>\n </div>\n </div>\n );\n};\n\ninterface TimelineProps {\n items: {\n date: string | null;\n description: string | null;\n status: 'completed' | 'current' | 'upcoming' | null;\n title: string;\n }[];\n}\n\nconst timelineDotClasses = {\n completed: 'fk:border-success fk:bg-success',\n current: 'fk:border-primary fk:bg-primary',\n upcoming: 'fk:border-border fk:bg-background',\n};\n\nconst Timeline: ComponentRenderer<TimelineProps> = ({ element }) => (\n <div className=\"fk:w-full\">\n {(element.props.items ?? []).map((item, index, items) => (\n <div className=\"fk:relative fk:flex fk:gap-3 fk:pb-4 fk:last:pb-0\" key={index}>\n {index < items.length - 1 && (\n <div className=\"fk:absolute fk:left-[5px] fk:top-4 fk:h-full fk:w-px fk:bg-border\" />\n )}\n <div\n className={`fk:mt-1 fk:size-[11px] fk:shrink-0 fk:rounded-full fk:border-2 ${timelineDotClasses[item.status ?? 'upcoming']} fk:corner-squircle`}\n />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:flex fk:flex-wrap fk:items-baseline fk:gap-x-2\">\n <span className=\"fk:text-sm fk:font-medium\">{item.title}</span>\n {item.date && <span className=\"fk:text-xs fk:text-muted-foreground\">{item.date}</span>}\n </div>\n {item.description && <div className=\"fk:text-sm fk:text-muted-foreground\">{item.description}</div>}\n </div>\n </div>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Charts\n// ---------------------------------------------------------------------------\n\nconst CHART_COLORS = ['#6366f1', '#10b981', '#f59e0b', '#ef4444', '#06b6d4'];\n\nconst chartTooltipStyle = {\n background: 'hsl(var(--background))',\n border: '1px solid hsl(var(--border))',\n borderRadius: 6,\n color: 'hsl(var(--foreground))',\n fontSize: 12,\n};\n\nconst chartTooltipItemStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTooltipLabelStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTick = { fill: 'hsl(var(--muted-foreground))', fontSize: 11 };\n\ninterface ChartPoint {\n x: string;\n y: number;\n}\n\ninterface CartesianChartProps {\n aggregate: 'sum' | 'count' | 'avg' | null;\n color: string | null;\n data: { [key: string]: unknown }[];\n height: number | null;\n title: string | null;\n xKey: string;\n yKey: string;\n}\n\nfunction toNumber(value: unknown): number {\n const parsed = typeof value === 'number' ? value : Number(value);\n\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction getChartPoints(props: CartesianChartProps): ChartPoint[] {\n const data = props.data ?? [];\n\n if (!props.aggregate) {\n return data.map((row) => ({\n x: String(row[props.xKey] ?? ''),\n y: toNumber(row[props.yKey]),\n }));\n }\n\n const groups = new Map<string, { count: number; sum: number }>();\n\n for (const row of data) {\n const key = String(row[props.xKey] ?? '');\n const group = groups.get(key) ?? { count: 0, sum: 0 };\n\n group.count += 1;\n group.sum += toNumber(row[props.yKey]);\n groups.set(key, group);\n }\n\n return Array.from(groups.entries()).map(([x, group]) => {\n if (props.aggregate === 'count') {\n return { x, y: group.count };\n }\n\n if (props.aggregate === 'avg') {\n return { x, y: group.count === 0 ? 0 : group.sum / group.count };\n }\n\n return { x, y: group.sum };\n });\n}\n\nfunction ChartFrame({\n children,\n height,\n title,\n}: {\n children: JSX.Element;\n height: number | null;\n title: string | null;\n}): JSX.Element {\n return (\n <div className=\"fk:w-full\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n <div style={{ height: height ?? 256 }}>\n <ResponsiveContainer height=\"100%\" width=\"100%\">\n {children}\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nconst BarChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsBarChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n cursor={{ fill: 'hsl(var(--muted))' }}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Bar dataKey=\"y\" fill={color} isAnimationActive={false} name={element.props.yKey} radius={4} />\n </RechartsBarChart>\n </ChartFrame>\n );\n};\n\nconst LineChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsLineChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Line\n dataKey=\"y\"\n dot={false}\n isAnimationActive={false}\n name={element.props.yKey}\n stroke={color}\n strokeWidth={2}\n type=\"monotone\"\n />\n </RechartsLineChart>\n </ChartFrame>\n );\n};\n\ninterface PieChartProps {\n data: { [key: string]: unknown }[];\n height: number | null;\n nameKey: string;\n title: string | null;\n valueKey: string;\n}\n\nconst PieChart: ComponentRenderer<PieChartProps> = ({ element }) => {\n const slices = (element.props.data ?? []).map((row) => ({\n name: String(row[element.props.nameKey] ?? ''),\n value: toNumber(row[element.props.valueKey]),\n }));\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsPieChart>\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Pie data={slices} dataKey=\"value\" innerRadius=\"45%\" isAnimationActive={false} nameKey=\"name\">\n {slices.map((slice, index) => (\n <Cell fill={CHART_COLORS[index % CHART_COLORS.length]} key={`${slice.name}-${index.toString()}`} />\n ))}\n </Pie>\n </RechartsPieChart>\n </ChartFrame>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Mermaid\n// ---------------------------------------------------------------------------\n\ninterface MermaidProps {\n chart: string;\n title: string | null;\n}\n\nconst Mermaid: ComponentRenderer<MermaidProps> = ({ element }) => {\n const { chart, title } = element.props;\n const diagramId = useId().replace(/[^a-zA-Z0-9]/g, '');\n const [svg, setSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n const render = async (): Promise<void> => {\n try {\n const { default: mermaid } = await import('mermaid');\n const isDark = document.documentElement.classList.contains('dark');\n\n mermaid.initialize({ securityLevel: 'strict', startOnLoad: false, theme: isDark ? 'dark' : 'default' });\n\n const result = await mermaid.render(`fk-mermaid-${diagramId}`, chart);\n\n if (!isCancelled) {\n setSvg(result.svg);\n setError(null);\n }\n } catch (renderError) {\n if (!isCancelled) {\n setError(renderError instanceof Error ? renderError.message : 'Failed to render the diagram.');\n }\n }\n };\n\n void render();\n\n return () => {\n isCancelled = true;\n };\n }, [chart, diagramId]);\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n {error ? (\n <pre className=\"fk:overflow-x-auto fk:whitespace-pre-wrap fk:text-xs fk:text-muted-foreground\">{chart}</pre>\n ) : null}\n {!error && svg ? (\n <div className=\"fk:flex fk:justify-center fk:overflow-x-auto\" dangerouslySetInnerHTML={{ __html: svg }} />\n ) : null}\n {!error && !svg ? <SkeletonPrimitive className=\"fk:h-40 fk:w-full\" /> : null}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Registry and spec rendering\n// ---------------------------------------------------------------------------\n\nconst registry: ComponentRegistry = {\n Accordion,\n Alert,\n Badge: BadgeComponent,\n BarChart,\n Callout,\n Card,\n Grid,\n Heading,\n Image,\n LineChart,\n Link: LinkComponent,\n Mermaid,\n Metric,\n PieChart,\n Progress,\n Separator,\n Skeleton,\n Stack,\n TabContent,\n Table,\n Tabs,\n Text,\n Timeline,\n};\n\nconst fallback: ComponentRenderer = ({ element }) => (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:border-border fk:p-3 fk:text-sm fk:text-muted-foreground fk:corner-squircle\">\n Unsupported component: {element.type}\n </div>\n);\n\nfunction getSanitizedChildren(childKeys: string[] | undefined, elements: Spec['elements']): string[] {\n const seen = new Set<string>();\n const children: string[] = [];\n\n for (const childKey of childKeys ?? []) {\n const normalizedKey = String(childKey);\n\n if (seen.has(normalizedKey) || !elements[normalizedKey]) {\n continue;\n }\n\n seen.add(normalizedKey);\n children.push(normalizedKey);\n }\n\n return children;\n}\n\nfunction haveChildrenChanged(original: string[], sanitized: string[]): boolean {\n if (original.length !== sanitized.length) {\n return true;\n }\n\n return sanitized.some((childKey, index) => childKey !== original[index]);\n}\n\nfunction sanitizeSpec(spec: Spec): Spec | null {\n if (!spec.elements[spec.root]) {\n return null;\n }\n\n let hasChanged = false;\n const elements: Spec['elements'] = {};\n\n for (const elementKey of Object.keys(spec.elements)) {\n const element = spec.elements[elementKey];\n\n if (!element) {\n continue;\n }\n\n const elementChildren = element.children ?? [];\n const children = getSanitizedChildren(elementChildren, spec.elements);\n const hasChildrenChanged = haveChildrenChanged(elementChildren, children);\n\n if (hasChildrenChanged) {\n hasChanged = true;\n }\n\n elements[elementKey] = hasChildrenChanged ? { ...element, children } : element;\n }\n\n if (!hasChanged) {\n return spec;\n }\n\n return { ...spec, elements };\n}\n\ninterface SpecMessagePart {\n data?: unknown;\n text?: string;\n type: string;\n}\n\nconst SPEC_DATA_PART_TYPE = 'data-spec';\n\nfunction dedupeSpecParts(parts: SpecMessagePart[]): SpecMessagePart[] {\n const seenPatchLines = new Set<string>();\n const deduped: SpecMessagePart[] = [];\n\n for (const part of parts) {\n if (part.type !== SPEC_DATA_PART_TYPE) {\n continue;\n }\n\n const payload = part.data;\n\n if (payload && typeof payload === 'object' && 'type' in payload && payload.type === 'patch' && 'patch' in payload) {\n const line = JSON.stringify(payload.patch);\n\n if (seenPatchLines.has(line)) {\n continue;\n }\n\n seenPatchLines.add(line);\n }\n\n deduped.push(part);\n }\n\n return deduped;\n}\n\nexport function RunSpecPart({ parts }: { parts: SpecMessagePart[] }): JSX.Element | null {\n const spec = useMemo(() => {\n const builtSpec = buildSpecFromParts(dedupeSpecParts(parts));\n\n return builtSpec ? sanitizeSpec(builtSpec) : null;\n }, [parts]);\n const stateKey = useMemo(() => JSON.stringify(spec?.state ?? {}), [spec]);\n\n if (!spec) {\n return null;\n }\n\n return (\n <StateProvider initialState={spec.state} key={stateKey}>\n <VisibilityProvider>\n <ActionProvider>\n <Renderer fallback={fallback} registry={registry} spec={spec} />\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\nexport type { SpecMessagePart };\n"]}
|
package/dist/ui.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';export{
|
|
1
|
+
import'./index.css';export{Rc as Alert,Tc as AlertDescription,Sc as AlertTitle,Eb as Attachment,Kb as AttachmentAction,Jb as AttachmentActions,Gb as AttachmentContent,Ib as AttachmentDescription,La as AttachmentEmpty,Mb as AttachmentGroup,Ia as AttachmentHoverCard,Ka as AttachmentHoverCardContent,Ja as AttachmentHoverCardTrigger,Ga as AttachmentInfo,Fb as AttachmentMedia,Fa as AttachmentPreview,Ha as AttachmentRemove,Hb as AttachmentTitle,Lb as AttachmentTrigger,Ea as Attachments,o as Checkbox,Ta as CodeBlock,Ra as CodeBlockActions,Na as CodeBlockContainer,Sa as CodeBlockContent,Ua as CodeBlockCopyButton,Qa as CodeBlockFilename,Oa as CodeBlockHeader,Va as CodeBlockLanguageSelector,Ya as CodeBlockLanguageSelectorContent,Za as CodeBlockLanguageSelectorItem,Wa as CodeBlockLanguageSelectorTrigger,Xa as CodeBlockLanguageSelectorValue,Pa as CodeBlockTitle,p as Collapsible,r as CollapsibleContent,q as CollapsibleTrigger,_a as Conversation,$a as ConversationContent,db as ConversationDownload,ab as ConversationEmptyState,bb as ConversationScrollButton,na as DrawerModal,f as ExternalLink,g as Form,l as FormControl,m as FormDescription,h as FormField,j as FormItem,k as FormLabel,n as FormMessage,qa as HoverCard,sa as HoverCardContent,ra as HoverCardTrigger,s as Input,ua as InputGroup,va as InputGroupAddon,wa as InputGroupButton,ya as InputGroupInput,xa as InputGroupText,za as InputGroupTextarea,la as InsufficientPermissionsTooltipContent,e as Label,Rb as LocalReferencedSourcesContext,eb as Message,hb as MessageAction,gb as MessageActions,ib as MessageBranch,jb as MessageBranchContent,mb as MessageBranchNext,nb as MessageBranchPage,lb as MessageBranchPrevious,kb as MessageBranchSelector,fb as MessageContent,ob as MessageResponse,pb as MessageToolbar,qb as ModelSelector,sb as ModelSelectorContent,tb as ModelSelectorDialog,wb as ModelSelectorEmpty,xb as ModelSelectorGroup,ub as ModelSelectorInput,yb as ModelSelectorItem,vb as ModelSelectorList,Bb as ModelSelectorLogo,Cb as ModelSelectorLogoGroup,Db as ModelSelectorName,Ab as ModelSelectorSeparator,zb as ModelSelectorShortcut,rb as ModelSelectorTrigger,ma as PermissionTooltip,t as Popover,w as PopoverAnchor,v as PopoverContent,u as PopoverTrigger,Vb as PromptInput,Tb as PromptInputActionAddAttachments,Ub as PromptInputActionAddScreenshot,ac as PromptInputActionMenu,cc as PromptInputActionMenuContent,dc as PromptInputActionMenuItem,bc as PromptInputActionMenuTrigger,Wb as PromptInputBody,$b as PromptInputButton,sc as PromptInputCommand,vc as PromptInputCommandEmpty,wc as PromptInputCommandGroup,tc as PromptInputCommandInput,xc as PromptInputCommandItem,uc as PromptInputCommandList,yc as PromptInputCommandSeparator,Zb as PromptInputFooter,Yb as PromptInputHeader,kc as PromptInputHoverCard,mc as PromptInputHoverCardContent,lc as PromptInputHoverCardTrigger,Pb as PromptInputProvider,fc as PromptInputSelect,hc as PromptInputSelectContent,ic as PromptInputSelectItem,gc as PromptInputSelectTrigger,jc as PromptInputSelectValue,ec as PromptInputSubmit,oc as PromptInputTab,qc as PromptInputTabBody,rc as PromptInputTabItem,pc as PromptInputTabLabel,nc as PromptInputTabsList,Xb as PromptInputTextarea,_b as PromptInputTools,Bc as Reasoning,Dc as ReasoningContent,Cc as ReasoningTrigger,z as ResizableHandle,y as ResizablePanel,x as ResizablePanelGroup,A as Sheet,C as SheetClose,F as SheetContent,J as SheetDescription,H as SheetFooter,G as SheetHeader,E as SheetOverlay,D as SheetPortal,I as SheetTitle,B as SheetTrigger,zc as Shimmer,Y as Sidebar,Q as SidebarContent,R as SidebarGroup,T as SidebarGroupContent,S as SidebarGroupLabel,P as SidebarInset,U as SidebarMenu,W as SidebarMenuButton,V as SidebarMenuItem,M as SidebarPanel,L as SidebarProvider,O as SidebarRail,N as SidebarTrigger,Hc as Source,Ec as Sources,Gc as SourcesContent,Fc as SourcesTrigger,Ic as SpeechInput,ta as Spinner,Kc as Suggestion,Jc as Suggestions,Z as Switch,_ as Table,aa as TableBody,fa as TableCaption,ea as TableCell,ba as TableFooter,da as TableHead,$ as TableHeader,ca as TableRow,ga as Tabs,ja as TabsContent,ha as TabsList,ia as TabsTrigger,ka as Textarea,pa as Toaster,b as Toggle,c as ToggleGroup,d as ToggleGroupItem,Lc as Tool,Oc as ToolContent,Nc as ToolHeader,Pc as ToolInput,Qc as ToolOutput,Ba as getAttachmentLabel,Aa as getMediaCategory,Mc as getStatusBadge,Ma as highlightCode,cb as messagesToMarkdown,oa as toast,a as toggleVariants,Da as useAttachmentContext,Ca as useAttachmentsContext,i as useFormField,Qb as usePromptInputAttachments,Nb as usePromptInputController,Sb as usePromptInputReferencedSources,Ob as useProviderAttachments,Ac as useReasoning,K as useSidebar}from'./chunk-YCCFUGWJ.js';export{b as Badge,z as ButtonGroup,B as ButtonGroupSeparator,A as ButtonGroupText,m as Command,n as CommandDialog,q as CommandEmpty,r as CommandGroup,o as CommandInput,t as CommandItem,p as CommandList,s as CommandSeparator,u as CommandShortcut,c as Dialog,f as DialogClose,h as DialogContent,l as DialogDescription,j as DialogFooter,i as DialogHeader,g as DialogOverlay,e as DialogPortal,k as DialogTitle,d as DialogTrigger,w as ScrollArea,x as ScrollBar,v as Separator,a as badgeVariants,y as buttonGroupVariants}from'./chunk-32ZU4MLE.js';export{a as Select,e as SelectContent,b as SelectGroup,g as SelectItem,f as SelectLabel,j as SelectScrollDownButton,i as SelectScrollUpButton,h as SelectSeparator,d as SelectTrigger,c as SelectValue}from'./chunk-HDOIOXMP.js';export{a as Avatar,c as AvatarFallback,d as AvatarGroup,b as AvatarImage,e as DropdownMenu,k as DropdownMenuCheckboxItem,h as DropdownMenuContent,i as DropdownMenuGroup,j as DropdownMenuItem,n as DropdownMenuLabel,f as DropdownMenuPortal,l as DropdownMenuRadioGroup,m as DropdownMenuRadioItem,o as DropdownMenuSeparator,p as DropdownMenuShortcut,q as DropdownMenuSub,s as DropdownMenuSubContent,r as DropdownMenuSubTrigger,g as DropdownMenuTrigger,t as Skeleton}from'./chunk-SZEGGBOC.js';import'./chunk-U45E5X3H.js';export{b as Tooltip,e as TooltipContent,d as TooltipPortal,a as TooltipProvider,c as TooltipTrigger}from'./chunk-USNXQOMJ.js';export{b as Button,a as buttonVariants}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';//# sourceMappingURL=ui.js.map
|
|
2
2
|
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import'./index.css';import {h}from'./chunk-NNA4MLFC.js';import {t,e,g,a,b as b$2,c,h as h$1,n,o,k,j,p}from'./chunk-SZEGGBOC.js';import {b}from'./chunk-U45E5X3H.js';import {b as b$1}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import v from'boring-avatars';import {Monitor,Moon,Sun}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var A=["#06d9b6","#a4f479","#d4d323","#fb468f","#0ec4f1"];function F({projectId:D}){let{theme:r,setTheme:t$1}=b(),[C,n$1]=h();return C?jsx(t,{className:"fk:h-8 fk:w-8 fk:rounded-full"}):jsxs(e,{children:[jsx(g,{asChild:true,children:jsx(b$1,{className:"fk:relative fk:h-8 fk:w-8 fk:rounded-full",variant:"ghost",children:jsxs(a,{className:"fk:h-8 fk:w-8",children:[n$1.user?.avatar_url?jsx(b$2,{alt:n$1.user.display_name,src:n$1.user.avatar_url}):null,jsx(c,{className:"fk:bg-transparent",children:jsx(v,{className:"fk:size-8",colors:A,name:n$1.user?.id??"user",size:32,variant:"marble"})})]})})}),jsxs(h$1,{align:"end",className:"fk:w-56",forceMount:true,children:[jsx(n,{className:"font-normal",children:jsxs("div",{className:"fk:flex fk:flex-col fk:space-y-1",children:[jsx("p",{className:"fk:text-sm fk:font-medium fk:leading-none",children:n$1.user?.display_name}),jsx("p",{className:"fk:text-xs fk:leading-none fk:text-muted-foreground",children:n$1.user?.email})]})}),jsx(o,{}),jsx(n,{children:"Theme"}),jsxs(k,{checked:r==="system",onCheckedChange:()=>{t$1("system");},children:[jsx(Monitor,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"System"})]}),jsxs(k,{checked:r==="dark",onCheckedChange:()=>{t$1("dark");},children:[jsx(Moon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Dark"})]}),jsxs(k,{checked:r==="light",onCheckedChange:()=>{t$1("light");},children:[jsx(Sun,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Light"})]}),jsx(o,{}),jsxs(j,{onClick:()=>{n$1.logout(D).then(()=>{}).catch(()=>{});},children:["Log out",jsx(p,{children:"\u21E7\u2318Q"})]})]})]})}export{F as UserNav};//# sourceMappingURL=user-nav-QZTYBG45.js.map
|
|
2
|
+
//# sourceMappingURL=user-nav-QZTYBG45.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/components/user-nav.tsx"],"names":["AVATAR_COLORS","UserNav","projectId","theme","setTheme","useTheme","isLoading","auth","useAuth","jsx","Skeleton","jsxs","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","BoringAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Monitor","Moon","Sun","DropdownMenuItem","DropdownMenuShortcut"],"mappings":"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","file":"user-nav-QZTYBG45.js","sourcesContent":["import type { JSX } from 'react';\nimport BoringAvatar from 'boring-avatars';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { useTheme } from '../theme-context';\nimport { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { Button } from '../primitives/button';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '../primitives/dropdown-menu';\nimport { useAuth } from '../../auth/auth-context';\n\nconst AVATAR_COLORS = ['#06d9b6', '#a4f479', '#d4d323', '#fb468f', '#0ec4f1'];\n\ntype Props = {\n projectId: string;\n};\n\nexport function UserNav({ projectId }: Props): JSX.Element {\n const { theme, setTheme } = useTheme();\n const [isLoading, auth] = useAuth();\n\n if (isLoading) {\n return <Skeleton className=\"fk:h-8 fk:w-8 fk:rounded-full\" />;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:relative fk:h-8 fk:w-8 fk:rounded-full\" variant=\"ghost\">\n <Avatar className=\"fk:h-8 fk:w-8\">\n {auth.user?.avatar_url ? <AvatarImage alt={auth.user.display_name} src={auth.user.avatar_url} /> : null}\n <AvatarFallback className=\"fk:bg-transparent\">\n <BoringAvatar\n className=\"fk:size-8\"\n colors={AVATAR_COLORS}\n name={auth.user?.id ?? 'user'}\n size={32}\n variant=\"marble\"\n />\n </AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-56\" forceMount>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"fk:flex fk:flex-col fk:space-y-1\">\n <p className=\"fk:text-sm fk:font-medium fk:leading-none\">{auth.user?.display_name}</p>\n <p className=\"fk:text-xs fk:leading-none fk:text-muted-foreground\">{auth.user?.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Theme</DropdownMenuLabel>\n <DropdownMenuCheckboxItem\n checked={theme === 'system'}\n onCheckedChange={() => {\n setTheme('system');\n }}\n >\n <Monitor className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>System</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'dark'}\n onCheckedChange={() => {\n setTheme('dark');\n }}\n >\n <Moon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Dark</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'light'}\n onCheckedChange={() => {\n setTheme('light');\n }}\n >\n <Sun className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Light</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n auth\n .logout(projectId)\n .then(() => {\n //\n })\n .catch(() => {\n //\n });\n }}\n >\n Log out\n <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flexkit/studio",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Flexkit Studio - Build custom internal tools like PIMs, CRMs, and ERPs with a flexible React UI and a graph-backed API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"flexkit",
|
|
@@ -157,8 +157,8 @@
|
|
|
157
157
|
"uuid": "^9.0.1",
|
|
158
158
|
"vaul": "1.1.2",
|
|
159
159
|
"zod": "4.4.3",
|
|
160
|
-
"@flexkit/agent-protocol": "^0.3.
|
|
161
|
-
"@flexkit/schema": "0.2.
|
|
160
|
+
"@flexkit/agent-protocol": "^0.3.2",
|
|
161
|
+
"@flexkit/schema": "0.2.3"
|
|
162
162
|
},
|
|
163
163
|
"peerDependencies": {
|
|
164
164
|
"react": "^19.0.0",
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import'./index.css';import {a}from'./chunk-OFLU53AC.js';import {f as f$2,b,c,g as g$1,a as a$1,e,d as d$1}from'./chunk-CSUHZFEP.js';import {p,s,z,l,j,i,k,m,q,n,d as d$2,y,v as v$1,t,f as f$3,g as g$2,e as e$1,r,x,A,w,o}from'./chunk-2FQWBOU6.js';import {g,f as f$1,a as a$3}from'./chunk-H6TOYVW2.js';import {f}from'./chunk-66N44IKJ.js';import'./chunk-NNA4MLFC.js';import {Ub,L,M,S,O,Sb,db,eb,gb,_b,bc,$b,ac,cc,dc,fc,gc,hc,Yb,kc,lc,oc,mc,nc,Nc,jc}from'./chunk-YIGEER6B.js';import {v}from'./chunk-ODORXGGY.js';import'./chunk-SZEGGBOC.js';import {d}from'./chunk-5DHOBLAE.js';import'./chunk-HDOIOXMP.js';import {a as a$2}from'./chunk-O2QMYUPS.js';import {useRef,useMemo,useState,useEffect,useLayoutEffect}from'react';import {LoaderCircle,CornerDownRightIcon,CheckIcon,CopyIcon,PencilIcon}from'lucide-react';import {useParams,useNavigate}from'react-router-dom';import ie,{useSWRConfig}from'swr';import {jsx,jsxs}from'react/jsx-runtime';function wt(e,t){let r=Date.parse(e.createdAt)-Date.parse(t.createdAt);return Number.isFinite(r)&&r!==0?r:e.createdAt!==t.createdAt?e.createdAt<t.createdAt?-1:1:e.id===t.id?0:e.id<t.id?-1:1}function re(e){return [...new Map(e.map(r=>[r.id,r])).values()].sort(wt)}function Ae(e,t){if(!t)return e;if(!e)return t;let r=new Set(t.messages.map(d=>d.id)),a=t.messages[t.messages.length-1],s=e.messages.filter(d=>!r.has(d.id)&&(!a||wt(d,a)>0));return s.length===0?t:{...t,messages:re([...t.messages,...s])}}var Jt="flexkit:agent:draft:";function xt(){return typeof localStorage>"u"?null:localStorage}function Pt(e,t){return `${Jt}${e}:${t??"new"}`}function bt(e,t=xt()){try{return t?.getItem(e)??""}catch{return ""}}function Dt(e,t,r=xt()){try{t.trim().length===0?r?.removeItem(e):r?.setItem(e,t);}catch{}}function qt(e){return e==="pending"||e==="streaming"||e==="awaiting_approval"}function Et(e){return e==="queued"||e==="steering"}function ke(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(r.role==="assistant"){if(!qt(r.status))break;return {after:e.slice(t+1),before:e.slice(0,t),live:r}}}return {after:[],before:e,live:null}}function Rt(e){return e==="steering"?"Picked up at the next step":e==="queued"?"Sends when this turn ends":null}function Nt(e){let t=new Set;for(let r of e)if(!(r.role!=="assistant"||!Array.isArray(r.parts)))for(let a of r.parts){let s=a.type==="data-mid-turn-message"?a.data?.messageId:null;typeof s=="string"&&t.add(s);}return t}function Ce(e){return e.find(t=>t.role==="user"&&t.status==="queued")??null}function _t(e){return e.streaming&&!e.hasDraft?"stop":"send"}var rn=6e4;function sn(e){if(!e)return 0;if(ke(e.messages).live||Ce(e.messages))return q;if(!e.messages.some(a=>a.role==="assistant"&&a.status==="complete"))return 0;let r=new Date(e.chat.lastMessageAt??e.chat.updatedAt).getTime();return Date.now()-r<rn?q:0}function an(e,t,r){return {chat:{createdAt:r,id:e,lastMessageAt:r,modelId:t,title:null,updatedAt:r},messages:[],pendingApproval:null}}function Ut(e,t,r,a,s,d){return e||(t?{chat:t,messages:[],pendingApproval:null}:r||an(a,s,d))}function Lt(e,t){let r=new Set([t.userMessage.id,t.assistantMessage.id]);return {...e,messages:re([...e.messages.filter(a=>!r.has(a.id)),t.userMessage,t.assistantMessage])}}function on(e,t){return {...e,messages:re([...e.messages.filter(r=>r.id!==t.id),t])}}function ln(e,t,r){return t?Ae(e[t],r):r}function un(e){return e==="awaiting_approval"?"awaiting_approval":e==="complete"?"success":e==="failed"?"failed":"running"}function Ne({attachments:e=[],label:t,text:r}){let{textInput:a}=Sb(),[s,d$1]=useState(false),c=r.trim().length>0;async function v(){await navigator.clipboard.writeText(r),d$1(true),setTimeout(()=>d$1(false),1500);}return jsxs("div",{className:"fk:group fk:ml-auto fk:flex fk:w-fit fk:max-w-[70%] fk:flex-col fk:items-end fk:gap-1",children:[jsx(o,{attachments:e}),c?jsx("div",{className:"fk:whitespace-pre-wrap fk:rounded-xl fk:bg-muted fk:dark:bg-white/20 fk:px-3.5 fk:py-2 fk:text-base fk:corner-squircle",children:r}):null,t?jsxs("span",{className:"fk:inline-flex fk:items-center fk:gap-1 fk:text-xs fk:text-muted-foreground",children:[jsx(CornerDownRightIcon,{className:"fk:size-3 fk:shrink-0"}),t]}):null,jsxs("div",{className:c?"fk:flex fk:gap-0.5 fk:opacity-0 fk:transition-opacity fk:group-hover:opacity-100":"fk:hidden",children:[jsxs(L,{children:[jsx(M,{asChild:true,children:jsx(d,{"aria-label":"Copy prompt",className:"fk:size-6 fk:text-muted-foreground",size:"icon",variant:"ghost",onClick:()=>{v();},children:s?jsx(CheckIcon,{className:"fk:size-3.5"}):jsx(CopyIcon,{className:"fk:size-3.5"})})}),jsx(O,{children:"Copy"})]}),jsxs(L,{children:[jsx(M,{asChild:true,children:jsx(d,{"aria-label":"Edit prompt",className:"fk:size-6 fk:text-muted-foreground",size:"icon",variant:"ghost",onClick:()=>a.setInput(r),children:jsx(PencilIcon,{className:"fk:size-3.5"})})}),jsx(O,{children:"Edit"})]})]})]})}function Bt(e){let r=e.find(a=>a.type==="data-suggested-prompt")?.data?.prompt;return typeof r=="string"&&r.trim()?r:null}function Ot({prompt:e}){let{textInput:t}=Sb();return jsx("div",{className:"fk:flex fk:justify-start",children:jsxs("button",{className:"fk:inline-flex fk:max-w-full fk:items-center fk:gap-1.5 fk:rounded-full fk:border fk:border-border/70 fk:bg-muted/40 fk:px-3 fk:py-1.5 fk:text-left fk:text-sm fk:text-muted-foreground fk:transition-colors fk:hover:border-border fk:hover:bg-muted fk:hover:ext-foreground fk:corner-squircle",title:"Use as your next message",type:"button",onClick:()=>t.setInput(e),children:[jsx(CornerDownRightIcon,{className:"fk:size-3 fk:shrink-0"}),jsx("span",{className:"fk:truncate",children:e})]})})}function dn({api:e,part:t,partIndex:r,parts:a}){return t.type.startsWith("tool-")?t.state==="output-error"?jsx(y,{message:t.errorText??"The tool call failed."}):null:jsx(x,{api:e,part:t,partIndex:r,parts:a})}function Ft({api:e,message:t,showSuggestion:r=false}){if(t.role==="user")return jsx(Ne,{attachments:n(t.parts),label:Rt(t.status),text:t.textContent});let a=(Array.isArray(t.parts)?t.parts:[]).filter(c=>!d$2(c)&&!(c.type.startsWith("tool-")&&c.state!=="output-error")),s=a.some(c=>c.type==="data-turn-error"),d=r&&!t.error?Bt(a):null;return a.length===0&&!t.error?null:jsxs("div",{className:"fk:w-full fk:min-w-0 fk:space-y-8",children:[a.map((c,v)=>jsx(dn,{api:e,part:c,partIndex:v,parts:a},c.toolCallId??`${t.id}-${v.toString()}`)),t.error&&!s?jsx(y,{message:t.error}):null,d?jsx(Ot,{prompt:d}):null]})}function fn({api:e,chatId:t$1,detail:r$1,message:a,onMidTurnDelivered:s,onStatusChange:d,onTurnUpdated:c}){let v=un(a.status),S=a.workflowRunId?e.getAgentChatStreamUrl(t$1,a.workflowRunId):"",[O,U]=useState(0),[p,M]=useState(false),[h,I]=useState({}),x$1=useRef(null),{message:A$1,status:m}=v$1(S,{decidedApprovals:h,recordStatus:v,resumeToken:O,suppressApprovalPause:p}),L=useMemo(()=>A$1?[{...A$1,parts:A$1.parts.filter(g=>!d$2(g))}]:[],[A$1]),b=t(L),j=useRef(c);j.current=c;let X=useRef(d);X.current=d;let F=useMemo(()=>({onApprovalDecided:(g,z)=>{g&&z&&z!=="pending"&&I(B=>({...B,[g]:z})),!(g&&x$1.current===g)&&(g&&(x$1.current=g),M(true),U(B=>B+1),j.current());}}),[]);useEffect(()=>{U(0),M(false),x$1.current=null,I({});},[a.id]),useEffect(()=>{p&&a.status==="streaming"&&M(false);},[a.status,p]),useEffect(()=>{(m==="finished"||m==="paused")&&j.current();},[m]);let u=(A$1?.parts??[]).filter(g=>g.type==="data-mid-turn-message").map(g=>String(g.data?.messageId??"")).join(`
|
|
2
|
-
`),i=useRef(s);i.current=s,useEffect(()=>{u&&i.current(u.split(`
|
|
3
|
-
`));},[u]);let D=!p&&a.status!=="streaming"&&(a.status==="awaiting_approval"||m==="paused"||f$3(A$1)),N=useMemo(()=>new Set(g$2(A$1)),[A$1]),_=r$1.pendingApproval&&!N.has(r$1.pendingApproval.id)?r$1.pendingApproval:null,Q=A$1?.parts[A$1.parts.length-1],ue=Q?.type==="text"&&Q.state==="streaming",K=D?"Awaiting approval":e$1(A$1)??"Thinking",H=D?m!=="finished"&&m!=="error":m==="streaming"&&!ue;useEffect(()=>{X.current({label:K,visible:H});},[K,H]);let E=!!_&&D,G=m==="finished"?Bt(b.flatMap(g=>g.parts)):null;return b.length===0&&!E?jsx(r.Provider,{value:F,children:null}):jsx(r.Provider,{value:F,children:jsxs("div",{className:"fk:w-full fk:min-w-0 fk:space-y-8",children:[b.map(g=>jsx("div",{className:"fk:space-y-8 fk:min-w-0",children:g.parts.map((z,B)=>jsx(x,{api:e,part:z,partIndex:B,parts:g.parts},B))},g.id)),_&&E?jsx(A,{api:e,message:w(_)}):null,G?jsx(Ot,{prompt:G}):null]})})}function cn({draftKey:e}){let{textInput:t}=Sb(),{setInput:r,value:a}=t,s=useRef(null);return useLayoutEffect(()=>{if(s.current===e){Dt(e,a);return}s.current=e;let d=bt(e);d!==a&&r(d);},[e,r,a]),null}function gn({api:e$1,effort:t,modelKey:r,modelPending:a,models:s,onEffortChange:d,onError:c$1,onModelChange:v,onSend:S,onStop:O,placeholder:U,sending:p,streaming:M}){let{attachments:h,textInput:I}=Sb(),x=l(e$1,c$1),A=useRef(false),m$1=s.filter(i=>!i.deprecated||b(i)===r),L=c(s,r),b$1=e(L),j$1=d$1(L,t),X=I.value.trim().length>0||h.files.length>0,F=_t({hasDraft:X,streaming:M}),u=X&&!x.isUploading&&!p&&!a;return jsxs(_b,{accept:k,className:"fk:mx-auto fk:max-w-4xl",maxFileSize:i,maxFiles:j,multiple:true,onError:i=>c$1(i.message),onSubmit:({text:i})=>{let D=i?.trim()??"",N=x.getUploaded(h.files.map(_=>_.id));return !D&&N.length===0||x.isUploading||p||A.current||a?Promise.reject(new Error("The message cannot be sent right now.")):(A.current=true,I.clear(),S(D,N).catch(_=>{throw I.setInput(i),_}).finally(()=>{A.current=false;}))},children:[h.files.length>0?jsx(bc,{children:jsx(m,{uploads:x})}):null,jsx($b,{children:jsx(ac,{disabled:p,placeholder:U})}),jsxs(cc,{children:[jsxs(dc,{children:[jsxs(fc,{children:[jsx(gc,{"aria-label":"Add attachments",className:"fk:border-0 fk:bg-border fk:corner-round",disabled:p,tooltip:"Add photos or files"}),jsx(hc,{children:jsx(Yb,{})})]}),m$1.length>0?jsxs(kc,{value:r??void 0,onValueChange:v,children:[jsx(lc,{"aria-label":"Model",className:"fk:min-w-44",children:jsx(oc,{placeholder:"Model"})}),jsx(mc,{children:m$1.map(i=>jsx(nc,{value:b(i),children:i.name},b(i)))})]}):null,b$1.length>1&&j$1?jsxs(kc,{value:j$1,onValueChange:d,children:[jsx(lc,{"aria-label":"Reasoning effort",className:"fk:min-w-28",children:jsx(oc,{placeholder:"Effort"})}),jsx(mc,{children:b$1.map(i=>jsx(nc,{value:i.value,children:i.label},i.value))})]}):null]}),jsxs("div",{className:"fk:flex fk:items-center fk:gap-3",children:[jsx(Nc,{disabled:p,onAudioRecorded:async(i,D)=>{let{text:N}=await e$1.transcribeAgentAudio(i,D);return N},onError:i=>c$1(i.message),onTranscriptionChange:i=>{c$1(null),I.setInput(a$3(I.value,i));}}),jsx(jc,{className:"fk:corner-round",disabled:F==="stop"?false:!u,status:F==="stop"?"streaming":void 0,onStop:()=>{O();}})]})]})]})}var Re={chatId:null,error:null,loading:false,older:[],page:null},pn=3e3;function mn({api:e,chatId:t,projectId:r,pendingFollowUp:a,pendingMessage:s,resolveDetail:d$1}){let{data:c,mutate:v}=ie(t?g(r).agentChat(t):null,f$1,{refreshInterval:0}),S=d$1(c),[O,U]=useState(Re),p=O.chatId===t?O:Re,M=useRef(t);M.current=t;let h=(o,C)=>U(y=>{if(y.chatId!==o&&M.current!==o)return y;let k=y.chatId===o?y:{...Re,chatId:o};return {...k,...C(k)}}),I=useRef({chatId:null,messages:[]}),x=S?.messages;useEffect(()=>{let o=I.current,C=x??[];if(I.current={chatId:t,messages:C},!t||o.chatId!==t)return;let y=new Set(C.map(T=>T.id)),k=o.messages.filter(T=>!y.has(T.id));k.length>0&&h(t,T=>({older:re([...T.older,...k])}));},[t,x]);let A=new Set(S?.messages.map(o=>o.id)??[]),m=[...p.older.filter(o=>!A.has(o.id)),...S?.messages??[]],L=useRef(S);L.current=S;let b=useRef(void 0);ie(t?`${g(r).agentChat(t)}?view=status`:null,f$1,{refreshInterval:()=>sn(L.current),onSuccess:o=>{let C=JSON.stringify(o),y=b.current;b.current=C;let{current:k}=L,T=k?[...k.messages].reverse().find(ve=>ve.role==="assistant"):void 0;(y&&y!==C||T&&o.latestMessage&&(T.id!==o.latestMessage.id||T.status!==o.latestMessage.status||T.workflowRunId!==o.latestMessage.workflowRunId||k?.chat.updatedAt!==o.chat.updatedAt))&&v();}});let j=async()=>{let o=p.page?.cursor??S?.nextCursor;if(!t||!o||p.loading)return;let C=t;h(C,()=>({error:null,loading:true}));try{let y=await f$1(`${g(r).agentChat(C)}?before=${encodeURIComponent(o)}`);h(C,k=>({loading:!1,older:re([...y.messages,...k.older]),page:{cursor:y.nextCursor??null,hasMore:y.hasMore??!1}}));}catch{h(C,()=>({error:"Could not load earlier messages. Try again.",loading:false}));}},{after:X,before:F,live:u}=ke(m),[i,D]=useState({ids:[],messageId:""}),N=Nt(m);for(let o of u&&i.messageId===u.id?i.ids:[])N.add(o);let _=X.filter(o=>Et(o.status)&&!N.has(o.id)),Q=F.filter(o=>!N.has(o.id)),K=(!u&&!s?Ce(m):null)?.id??null,[H,E]=useState(0),G=useRef(null);useEffect(()=>{if(!t||!K||G.current===K)return;G.current=K;let o=false,C=null;return e.startQueuedAgentChatMessage(t,K).then(()=>{},()=>{C=setTimeout(()=>{o||E(y=>y+1);},pn);}).finally(()=>{G.current=null,v();}),()=>{o=true,C&&clearTimeout(C);}},[e,t,v,K,H]);let[g$1,z$1]=useState(null),B=u&&g$1?.messageId===u.id?g$1.status:null;if(t&&!S&&!s)return jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:justify-center fk:gap-2 fk:text-sm fk:text-muted-foreground",children:[jsx(LoaderCircle,{className:"fk:size-4 fk:animate-spin"}),"Loading chat..."]});let se=!!s||!!u,Y=[...Q].reverse().find(o=>o.role==="assistant")?.id??null,V=u?B?.label??"Thinking":"Sending",de=u?B?.visible??true:true;return jsxs(db,{className:"fk:h-0 fk:min-h-0 fk:flex-1",children:[jsx(eb,{className:"fk:gap-0 fk:p-0",children:jsxs("div",{className:"fk:mx-auto fk:w-full fk:max-w-4xl fk:space-y-5 fk:pb-6 fk:pr-4",children:[p.page?.hasMore??S?.hasMore?jsx(d,{variant:"ghost",disabled:p.loading,onClick:()=>{j();},children:p.loading?"Loading\u2026":"Load earlier messages"}):null,p.error?jsx("p",{role:"alert",children:p.error}):null,Q.map(o=>jsx(Ft,{api:e,message:o,showSuggestion:!se&&o.id===Y},o.id)),u&&t&&S?jsx(fn,{api:e,chatId:t,detail:S,message:u,onMidTurnDelivered:o=>D({ids:o,messageId:u.id}),onStatusChange:o=>z$1({messageId:u.id,status:o}),onTurnUpdated:()=>{v();}}):null,s&&!u?jsx(Ne,{attachments:s.attachments,text:s.text}):null,se?jsx(z,{label:V,visible:de}):null,_.map(o=>jsx(Ft,{api:e,message:o},o.id)),a&&u?jsx(Ne,{attachments:a.attachments,text:a.text}):null]})}),jsx(gb,{})]})}var Kt=["Where should we begin?","Ready when you are","What\u2019s on the agenda today?","What\u2019s on your mind today?"];function hn(e){return [`How can I help, ${e}?`,`Good to see you, ${e}.`,`Hey, ${e}. Ready to dive in?`]}function An(e){let t=e?[...Kt,...hn(e)]:Kt;return t[Math.floor(Math.random()*t.length)]??"How can I help?"}var jt="flexkit-ai:lastModelId",_e="flexkit-ai:lastEffort";function kn(){if(typeof localStorage>"u")return null;try{let e=localStorage.getItem(jt);return e?{effort:localStorage.getItem(_e),modelKey:e}:null}catch{return null}}function Cn(e){return e.selectedModelKey?{effort:e.selectedEffort,modelKey:e.selectedModelKey}:e.awaitingChatModel?{effort:null,modelKey:null}:e.chatSelection?{effort:e.selectedEffort??e.chatSelection.effort,modelKey:e.chatSelection.modelKey}:e.lastUsed?{effort:e.selectedEffort??e.lastUsed.effort,modelKey:e.lastUsed.modelKey}:{effort:e.selectedEffort,modelKey:e.defaultModelKey}}function vn(e){if(!(typeof localStorage>"u"))try{localStorage.setItem(jt,e.modelKey),e.effort?localStorage.setItem(_e,e.effort):localStorage.removeItem(_e);}catch{}}function Sn({projectId:e}){let{data:t,isLoading:r}=ie(g(e).agentProfile(),f$1),a=useMemo(()=>r?null:An(t?.preferredName??null),[t,r]);return jsx("div",{className:"fk:flex fk:flex-col fk:items-center fk:pb-2 fk:text-center",children:jsx("h2",{className:"fk:text-2xl fk:font-semibold",children:a??"\xA0"})})}function On(){let{api:e,projectId:t}=p(),{currentProject:r,projectSummaries:a$3}=f(),{chatId:s$1}=useParams(),d=useNavigate(),c$1=a(),{mutate:v$1}=useSWRConfig(),{data:S$1}=ie(t?g(t).tools():null,f$1),{data:O$1}=ie(t&&s$1?g(t).agentChat(s$1):null,f$1),U=useRef({});function p$1(l){return ln(U.current,s$1,l)}let M$1=p$1(O$1),h=useMemo(()=>S$1?.tools.models??[],[S$1]),[I,x]=useState(null),[A,m]=useState(null),L$1=useRef(null),[b$1,j]=useState(kn),[X,F]=useState(false),u=useRef(false),[i,D]=useState(null),N=i&&i.chatId===s$1?i:void 0,[_,Q]=useState(null),ue=_&&_.chatId===s$1?_:void 0,[K,H]=useState(null),E=M$1?.chat.modelId??null,G=!!s$1&&M$1===void 0,g$2=useMemo(()=>f$2(E,h)??(E?{effort:null,modelKey:E}:null),[E,h]),z=useMemo(()=>{let l=h.find(J=>!J.deprecated);return l?b(l):null},[h]),B=useMemo(()=>{let l=c(h,b$1?.modelKey??null);return b$1&&l&&!l.deprecated?b$1:null},[h,b$1]),{effort:se,modelKey:Y}=Cn({awaitingChatModel:G,chatSelection:g$2,defaultModelKey:z,lastUsed:B,selectedEffort:A,selectedModelKey:I}),V=Y?g$1({effort:se,modelKey:Y},h):null,de=G&&!I;useEffect(()=>{L$1.current=null,x(null),m(null),H(null);},[s$1]),useEffect(()=>{I===a$1&&E&&E!==a$1&&E!==L$1.current&&(x(null),m(null));},[E,I]);function o(l){j(l),vn(l);}function C(l){L$1.current=l===a$1?E:null,x(l),m(null),o({effort:null,modelKey:l});}function y(l){m(l),Y&&o({effort:l,modelKey:Y});}if(!t||!e)return jsx("div",{className:"fk:flex fk:h-full fk:items-center fk:justify-center fk:text-sm fk:text-muted-foreground",children:"Select a project to chat with the agent."});let k=e,T=t,ve=r?.title??a$3.find(l=>l.id===t)?.name??"your project",Ue=!s$1&&!N,fe=!!(M$1&&ke(M$1.messages).live);async function $t(l,J,te){Q({attachments:te,chatId:l,text:J});try{let w=await k.sendAgentChatFollowUp(l,{attachments:te,content:J,modelId:V});await v$1(g(T).agentChat(l),ne=>{let ae=Ut(Ae(U.current[l],ne),null,O$1,l,V,"turn"in w?w.turn.userMessage.createdAt:w.followUp.message.createdAt),Z="turn"in w?Lt(ae,w.turn):on(ae,w.followUp.message);return U.current[l]=Z,Z},{revalidate:!1});}finally{Q(null);}}async function Xt(l,J){if(u.current)throw new Error("A message is already being sent.");if(de)throw new Error("This chat is still loading.");u.current=true,F(true),H(null);let te=M$1?Ce(M$1.messages):null;if(s$1&&(fe||te)){try{!fe&&te&&await k.startQueuedAgentChatMessage(s$1,te.id).catch(()=>{}),await $t(s$1,l,J);}catch(w){throw H(w instanceof Error?w.message:"Failed to send the message."),w}finally{u.current=false,F(false);}return}D({attachments:J,chatId:s$1,text:l});try{let w=s$1?{chat:null,turn:await k.sendAgentChatMessage(s$1,{attachments:J,content:l,modelId:V})}:await k.startAgentChat({attachments:J,content:l,modelId:V}),{chat:ne,turn:ae}=w,Z=s$1??ne.id;await v$1(g(T).agentChat(Z),zt=>{let Le=Lt(Ut(Ae(U.current[Z],zt),ne,O$1,Z,V,ae.userMessage.createdAt),ae);return U.current[Z]=Le,Le},{revalidate:!1}),ne&&d(`${c$1}/chats/${ne.id}`),D(null);}catch(w){throw D(null),H(w instanceof Error?w.message:"Failed to send the message."),w}finally{u.current=false,F(false);}}async function Gt(){if(s$1)try{await k.stopAgentChat(s$1);}catch(l){H(l instanceof Error?l.message:"Failed to stop the turn.");}finally{await v$1(g(T).agentChat(s$1));}}return jsxs(Ub,{children:[jsx(cn,{draftKey:Pt(T,s$1)}),jsxs("div",{className:"fk:flex fk:h-full fk:min-h-0 fk:flex-col fk:gap-2",children:[jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-start fk:gap-2",children:[jsxs(L,{children:[jsx(M,{asChild:true,children:jsx(S,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(O,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:mt-1 fk:h-4"}),jsx("div",{className:"fk:flex fk:flex-1 fk:items-center fk:gap-2",children:jsx("h1",{className:"fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:s$1?M$1?.chat.title?.trim()??"Chat":"Agent"})})]}),jsx("div",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:gap-4",children:jsxs("div",{className:a$2("fk:flex fk:min-h-0 fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-3",Ue&&"fk:justify-center fk:pb-[12vh]"),children:[Ue?jsx(Sn,{projectId:T}):jsx(s.Provider,{value:true,children:jsx(mn,{api:k,chatId:s$1??null,pendingFollowUp:ue,pendingMessage:N,projectId:t,resolveDetail:p$1})}),jsxs("div",{className:"fk:shrink-0 fk:pb-3",children:[K?jsx("p",{className:"fk:mx-auto fk:mb-2 fk:max-w-4xl fk:text-xs fk:text-destructive",children:K}):null,jsx(gn,{api:k,effort:se,modelKey:Y,modelPending:de,models:h,sending:X,streaming:fe,onEffortChange:y,onError:H,onModelChange:C,onSend:Xt,onStop:Gt,placeholder:fe?"Add context or steer the agent...":`Ask Flexkit anything about ${ve}...`})]})]})})]})]})}export{On as AgentChatPage};//# sourceMappingURL=chat-page-YWENJEUP.js.map
|
|
4
|
-
//# sourceMappingURL=chat-page-YWENJEUP.js.map
|