@flexkit/studio 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/chat-page-H6I3XOKS.js +2 -0
  2. package/dist/chat-page-H6I3XOKS.js.map +1 -0
  3. package/dist/{chunk-LMVJWCOM.js → chunk-2IRKGO2B.js} +3 -3
  4. package/dist/{chunk-LMVJWCOM.js.map → chunk-2IRKGO2B.js.map} +1 -1
  5. package/dist/{chunk-WBZKCRQK.js → chunk-5TQF5UQQ.js} +2 -2
  6. package/dist/{chunk-WBZKCRQK.js.map → chunk-5TQF5UQQ.js.map} +1 -1
  7. package/dist/{chunk-DQ6Z333C.js → chunk-ANVO5P65.js} +3 -3
  8. package/dist/{chunk-DQ6Z333C.js.map → chunk-ANVO5P65.js.map} +1 -1
  9. package/dist/chunk-BURKG2UC.js +6 -0
  10. package/dist/chunk-BURKG2UC.js.map +1 -0
  11. package/dist/{chunk-QJWY4XIM.js → chunk-GM5OZTHL.js} +2 -2
  12. package/dist/{chunk-QJWY4XIM.js.map → chunk-GM5OZTHL.js.map} +1 -1
  13. package/dist/{chunk-LX7Q56OS.js → chunk-JYHZU2UZ.js} +2 -2
  14. package/dist/{chunk-LX7Q56OS.js.map → chunk-JYHZU2UZ.js.map} +1 -1
  15. package/dist/{chunk-BKJ2DBRK.js → chunk-LQVZWFM2.js} +2 -2
  16. package/dist/{chunk-BKJ2DBRK.js.map → chunk-LQVZWFM2.js.map} +1 -1
  17. package/dist/{chunk-6LYEDKFY.js → chunk-QHDL6CA2.js} +3 -3
  18. package/dist/{chunk-6LYEDKFY.js.map → chunk-QHDL6CA2.js.map} +1 -1
  19. package/dist/{chunk-G4PYYHI3.js → chunk-S7M5CQ5S.js} +2 -2
  20. package/dist/{chunk-G4PYYHI3.js.map → chunk-S7M5CQ5S.js.map} +1 -1
  21. package/dist/{chunk-DPCMOWK4.js → chunk-ZBI744KS.js} +3 -3
  22. package/dist/{chunk-DPCMOWK4.js.map → chunk-ZBI744KS.js.map} +1 -1
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +1 -1
  25. package/dist/{list-GALFFS5F.js → list-ZQJ6NHKQ.js} +2 -2
  26. package/dist/{list-GALFFS5F.js.map → list-ZQJ6NHKQ.js.map} +1 -1
  27. package/dist/{pages-IA7GOMMS.js → pages-2GQVTLL2.js} +3 -3
  28. package/dist/{pages-IA7GOMMS.js.map → pages-2GQVTLL2.js.map} +1 -1
  29. package/dist/plugin-pages-E5TUDDT5.js +2 -0
  30. package/dist/{plugin-pages-Q63UBSKH.js.map → plugin-pages-E5TUDDT5.js.map} +1 -1
  31. package/dist/{root-SMHRBFGW.js → root-BD4VN3RD.js} +3 -3
  32. package/dist/{root-SMHRBFGW.js.map → root-BD4VN3RD.js.map} +1 -1
  33. package/dist/{root-VSTE2THV.js → root-HC5QZ2JM.js} +2 -2
  34. package/dist/{root-VSTE2THV.js.map → root-HC5QZ2JM.js.map} +1 -1
  35. package/dist/{root-VYZYDWIB.js → root-P6CVZ5ZB.js} +2 -2
  36. package/dist/{root-VYZYDWIB.js.map → root-P6CVZ5ZB.js.map} +1 -1
  37. package/dist/{root-5TCUJI6Q.js → root-TXKDRPOK.js} +3 -3
  38. package/dist/{root-5TCUJI6Q.js.map → root-TXKDRPOK.js.map} +1 -1
  39. package/dist/{search-K75Q65A6.js → search-PVXTPIYJ.js} +2 -2
  40. package/dist/{search-K75Q65A6.js.map → search-PVXTPIYJ.js.map} +1 -1
  41. package/dist/{skills-pages-KDG2NOQJ.js → skills-pages-N5KDEHLT.js} +2 -2
  42. package/dist/{skills-pages-KDG2NOQJ.js.map → skills-pages-N5KDEHLT.js.map} +1 -1
  43. package/dist/spec-renderer-ZZ3GPVKU.js +2 -0
  44. package/dist/spec-renderer-ZZ3GPVKU.js.map +1 -0
  45. package/dist/ui.js +1 -1
  46. package/package.json +3 -3
  47. package/dist/chat-page-ZFPMTRLD.js +0 -2
  48. package/dist/chat-page-ZFPMTRLD.js.map +0 -1
  49. package/dist/chunk-MKEIZ5ZQ.js +0 -5
  50. package/dist/chunk-MKEIZ5ZQ.js.map +0 -1
  51. package/dist/plugin-pages-Q63UBSKH.js +0 -2
@@ -1,2 +1,2 @@
1
- import'./index.css';import {t,u,v as v$1}from'./chunk-6LYEDKFY.js';import {v,b,m,o,p,q,r,t as t$1,s}from'./chunk-ODORXGGY.js';import {d}from'./chunk-5DHOBLAE.js';import {a}from'./chunk-O2QMYUPS.js';import {CirclePlus,Check}from'lucide-react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function w({column:s$1,title:i,options:d$1}){let r$1=new Set(s$1?.getFilterValue());return jsxs(t,{children:[jsx(u,{asChild:true,children:jsxs(d,{variant:"outline",size:"sm",className:"fk:h-8 fk:border-dashed",children:[jsx(CirclePlus,{className:"fk:mr-2 fk:h-4 fk:w-4"}),i,r$1?.size>0&&jsxs(Fragment,{children:[jsx(v,{orientation:"vertical",className:"fk:mx-2 fk:h-4"}),jsx(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:lg:hidden fk:corner-squircle",children:r$1.size}),jsx("div",{className:"fk:space-x-1 fk:lg:flex",children:r$1.size>2?jsxs(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle",children:[r$1.size," selected"]}):d$1.filter(a=>r$1.has(a.value)).map(a=>jsx(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle",children:a.label},a.value))})]})]})}),jsx(v$1,{className:"fk:w-50 fk:p-0",align:"start",children:jsxs(m,{children:[jsx(o,{placeholder:i}),jsxs(p,{children:[jsx(q,{children:"No results found."}),jsx(r,{children:d$1.map(a$1=>{let m=r$1.has(a$1.value);return jsxs(t$1,{onSelect:()=>{m?r$1.delete(a$1.value):r$1.add(a$1.value);let c=Array.from(r$1);s$1?.setFilterValue(c.length?c:void 0);},children:[jsx("div",{className:a("fk:mr-2 fk:flex fk:h-4 fk:w-4 fk:items-center fk:justify-center fk:rounded-xs fk:border fk:border-primary fk:corner-squircle",m?"fk:bg-primary fk:text-primary-foreground":"fk:opacity-50 fk:[&_svg]:invisible"),children:jsx(Check,{className:a("fk:size-3.5",m?"fk:text-primary-foreground":"fk:text-muted-foreground")})}),a$1.icon&&jsx(a$1.icon,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:text-muted-foreground"}),jsx("span",{children:a$1.label})]},a$1.value)})}),r$1.size>0&&jsxs(Fragment,{children:[jsx(s,{}),jsx(r,{children:jsx(t$1,{onSelect:()=>s$1?.setFilterValue(void 0),className:"fk:justify-center fk:text-center",children:"Clear filters"})})]})]})]})})]})}export{w as a};//# sourceMappingURL=chunk-G4PYYHI3.js.map
2
- //# sourceMappingURL=chunk-G4PYYHI3.js.map
1
+ import'./index.css';import {t,u,v as v$1}from'./chunk-QHDL6CA2.js';import {v,b,m,o,p,q,r,t as t$1,s}from'./chunk-ODORXGGY.js';import {d}from'./chunk-5DHOBLAE.js';import {a}from'./chunk-O2QMYUPS.js';import {CirclePlus,Check}from'lucide-react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function w({column:s$1,title:i,options:d$1}){let r$1=new Set(s$1?.getFilterValue());return jsxs(t,{children:[jsx(u,{asChild:true,children:jsxs(d,{variant:"outline",size:"sm",className:"fk:h-8 fk:border-dashed",children:[jsx(CirclePlus,{className:"fk:mr-2 fk:h-4 fk:w-4"}),i,r$1?.size>0&&jsxs(Fragment,{children:[jsx(v,{orientation:"vertical",className:"fk:mx-2 fk:h-4"}),jsx(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:lg:hidden fk:corner-squircle",children:r$1.size}),jsx("div",{className:"fk:space-x-1 fk:lg:flex",children:r$1.size>2?jsxs(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle",children:[r$1.size," selected"]}):d$1.filter(a=>r$1.has(a.value)).map(a=>jsx(b,{variant:"secondary",className:"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle",children:a.label},a.value))})]})]})}),jsx(v$1,{className:"fk:w-50 fk:p-0",align:"start",children:jsxs(m,{children:[jsx(o,{placeholder:i}),jsxs(p,{children:[jsx(q,{children:"No results found."}),jsx(r,{children:d$1.map(a$1=>{let m=r$1.has(a$1.value);return jsxs(t$1,{onSelect:()=>{m?r$1.delete(a$1.value):r$1.add(a$1.value);let c=Array.from(r$1);s$1?.setFilterValue(c.length?c:void 0);},children:[jsx("div",{className:a("fk:mr-2 fk:flex fk:h-4 fk:w-4 fk:items-center fk:justify-center fk:rounded-xs fk:border fk:border-primary fk:corner-squircle",m?"fk:bg-primary fk:text-primary-foreground":"fk:opacity-50 fk:[&_svg]:invisible"),children:jsx(Check,{className:a("fk:size-3.5",m?"fk:text-primary-foreground":"fk:text-muted-foreground")})}),a$1.icon&&jsx(a$1.icon,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:text-muted-foreground"}),jsx("span",{children:a$1.label})]},a$1.value)})}),r$1.size>0&&jsxs(Fragment,{children:[jsx(s,{}),jsx(r,{children:jsx(t$1,{onSelect:()=>s$1?.setFilterValue(void 0),className:"fk:justify-center fk:text-center",children:"Clear filters"})})]})]})]})})]})}export{w as a};//# sourceMappingURL=chunk-S7M5CQ5S.js.map
2
+ //# sourceMappingURL=chunk-S7M5CQ5S.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data-grid/data-table-faceted-filter.tsx"],"names":["DataTableFacetedFilter","column","title","options","selectedValues","jsxs","Popover","jsx","PopoverTrigger","Button","CirclePlusIcon","Fragment","Separator","Badge","option","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","filterValues","cn","CheckIcon","CommandSeparator"],"mappings":"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","file":"chunk-G4PYYHI3.js","sourcesContent":["import * as React from 'react';\nimport { Check as CheckIcon, CirclePlus as CirclePlusIcon } from 'lucide-react';\nimport { Column } from '@tanstack/react-table';\nimport { cn } from '../ui/lib/utils';\nimport { Badge } from '../ui/primitives/badge';\nimport { Button } from '../ui/primitives/button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../ui/primitives/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/primitives/popover';\nimport { Separator } from '../ui/primitives/separator';\n\ninterface DataTableFacetedFilterProps<TData, TValue> {\n column?: Column<TData, TValue>;\n title?: string;\n options: {\n label: string;\n value: string;\n icon?: React.ComponentType<{ className?: string }>;\n }[];\n}\n\nexport function DataTableFacetedFilter<TData, TValue>({\n column,\n title,\n options,\n}: DataTableFacetedFilterProps<TData, TValue>) {\n const selectedValues = new Set(column?.getFilterValue() as string[]);\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"fk:h-8 fk:border-dashed\">\n <CirclePlusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n {title}\n {selectedValues?.size > 0 && (\n <>\n <Separator orientation=\"vertical\" className=\"fk:mx-2 fk:h-4\" />\n <Badge variant=\"secondary\" className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:lg:hidden fk:corner-squircle\">\n {selectedValues.size}\n </Badge>\n <div className=\"fk:space-x-1 fk:lg:flex\">\n {selectedValues.size > 2 ? (\n <Badge variant=\"secondary\" className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle\">\n {selectedValues.size} selected\n </Badge>\n ) : (\n options\n .filter((option) => selectedValues.has(option.value))\n .map((option) => (\n <Badge variant=\"secondary\" key={option.value} className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle\">\n {option.label}\n </Badge>\n ))\n )}\n </div>\n </>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"fk:w-50 fk:p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder={title} />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => {\n const isSelected = selectedValues.has(option.value);\n return (\n <CommandItem\n key={option.value}\n onSelect={() => {\n if (isSelected) {\n selectedValues.delete(option.value);\n } else {\n selectedValues.add(option.value);\n }\n const filterValues = Array.from(selectedValues);\n column?.setFilterValue(filterValues.length ? filterValues : undefined);\n }}\n >\n <div\n className={cn(\n 'fk:mr-2 fk:flex fk:h-4 fk:w-4 fk:items-center fk:justify-center fk:rounded-xs fk:border fk:border-primary fk:corner-squircle',\n isSelected ? 'fk:bg-primary fk:text-primary-foreground' : 'fk:opacity-50 fk:[&_svg]:invisible'\n )}\n >\n <CheckIcon\n className={cn(\n 'fk:size-3.5',\n isSelected ? 'fk:text-primary-foreground' : 'fk:text-muted-foreground'\n )}\n />\n </div>\n {option.icon && <option.icon className=\"fk:mr-2 fk:h-4 fk:w-4 fk:text-muted-foreground\" />}\n <span>{option.label}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n {selectedValues.size > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem\n onSelect={() => column?.setFilterValue(undefined)}\n className=\"fk:justify-center fk:text-center\"\n >\n Clear filters\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/data-grid/data-table-faceted-filter.tsx"],"names":["DataTableFacetedFilter","column","title","options","selectedValues","jsxs","Popover","jsx","PopoverTrigger","Button","CirclePlusIcon","Fragment","Separator","Badge","option","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","isSelected","CommandItem","filterValues","cn","CheckIcon","CommandSeparator"],"mappings":"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","file":"chunk-S7M5CQ5S.js","sourcesContent":["import * as React from 'react';\nimport { Check as CheckIcon, CirclePlus as CirclePlusIcon } from 'lucide-react';\nimport { Column } from '@tanstack/react-table';\nimport { cn } from '../ui/lib/utils';\nimport { Badge } from '../ui/primitives/badge';\nimport { Button } from '../ui/primitives/button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../ui/primitives/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/primitives/popover';\nimport { Separator } from '../ui/primitives/separator';\n\ninterface DataTableFacetedFilterProps<TData, TValue> {\n column?: Column<TData, TValue>;\n title?: string;\n options: {\n label: string;\n value: string;\n icon?: React.ComponentType<{ className?: string }>;\n }[];\n}\n\nexport function DataTableFacetedFilter<TData, TValue>({\n column,\n title,\n options,\n}: DataTableFacetedFilterProps<TData, TValue>) {\n const selectedValues = new Set(column?.getFilterValue() as string[]);\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"fk:h-8 fk:border-dashed\">\n <CirclePlusIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n {title}\n {selectedValues?.size > 0 && (\n <>\n <Separator orientation=\"vertical\" className=\"fk:mx-2 fk:h-4\" />\n <Badge variant=\"secondary\" className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:lg:hidden fk:corner-squircle\">\n {selectedValues.size}\n </Badge>\n <div className=\"fk:space-x-1 fk:lg:flex\">\n {selectedValues.size > 2 ? (\n <Badge variant=\"secondary\" className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle\">\n {selectedValues.size} selected\n </Badge>\n ) : (\n options\n .filter((option) => selectedValues.has(option.value))\n .map((option) => (\n <Badge variant=\"secondary\" key={option.value} className=\"fk:rounded-xs fk:px-1 fk:font-normal fk:corner-squircle\">\n {option.label}\n </Badge>\n ))\n )}\n </div>\n </>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"fk:w-50 fk:p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder={title} />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup>\n {options.map((option) => {\n const isSelected = selectedValues.has(option.value);\n return (\n <CommandItem\n key={option.value}\n onSelect={() => {\n if (isSelected) {\n selectedValues.delete(option.value);\n } else {\n selectedValues.add(option.value);\n }\n const filterValues = Array.from(selectedValues);\n column?.setFilterValue(filterValues.length ? filterValues : undefined);\n }}\n >\n <div\n className={cn(\n 'fk:mr-2 fk:flex fk:h-4 fk:w-4 fk:items-center fk:justify-center fk:rounded-xs fk:border fk:border-primary fk:corner-squircle',\n isSelected ? 'fk:bg-primary fk:text-primary-foreground' : 'fk:opacity-50 fk:[&_svg]:invisible'\n )}\n >\n <CheckIcon\n className={cn(\n 'fk:size-3.5',\n isSelected ? 'fk:text-primary-foreground' : 'fk:text-muted-foreground'\n )}\n />\n </div>\n {option.icon && <option.icon className=\"fk:mr-2 fk:h-4 fk:w-4 fk:text-muted-foreground\" />}\n <span>{option.label}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n {selectedValues.size > 0 && (\n <>\n <CommandSeparator />\n <CommandGroup>\n <CommandItem\n onSelect={() => column?.setFilterValue(undefined)}\n className=\"fk:justify-center fk:text-center\"\n >\n Clear filters\n </CommandItem>\n </CommandGroup>\n </>\n )}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
@@ -1,3 +1,3 @@
1
- import'./index.css';import {h,e}from'./chunk-NNA4MLFC.js';import {b as b$1}from'./chunk-5DHOBLAE.js';import {createContext,lazy,Suspense,useMemo,useContext}from'react';import {Navigate,useParams}from'react-router-dom';import {Layout,FileStack,SquarePlay,Bot}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';import C,{mutate}from'swr';var d={name:"_asset",plural:"_assets",display:"originalFilename",menu:{hidden:true},attributes:[{name:"path",label:"Asset",scope:"global",options:{size:140},dataType:"string",inputType:"text",previewType:"assetPreviewField",defaultValue:""},{name:"originalFilename",label:"Filename",scope:"global",options:{size:320},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"size",label:"Size",scope:"global",options:{size:120},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"width",label:"Width",scope:"global",options:{size:90},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"height",label:"Height",scope:"global",options:{size:100},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"mimeType",label:"Mime Type",scope:"global",options:{size:160},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"lqip",label:"lqip",scope:"global",hidden:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"url",label:"URL",scope:"global",hidden:true,readOnly:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"tags",label:"Tags",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",previewType:"tags",options:{size:300},relationship:{mode:"multiple",field:"name",entity:"_tag"}}]};var f={name:"_tag",plural:"_tags",display:"name",menu:{hidden:true},attributes:[{name:"name",label:"Tag Name",scope:"global",options:{size:220},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"assets",label:"Assets",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",relationship:{mode:"multiple",field:"originalFilename",entity:"_asset"}}]};function T(){let{resolvedTheme:e}=b$1();return jsx("div",{className:"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background",children:jsxs("div",{className:"fk:flex fk:flex-col fk:items-center",children:[e==="dark"?jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"#020817"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"white"})]}):jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"white"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"#020817"})]}),jsx("div",{className:"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse",children:"Loading..."})]})})}var _=Navigate;function a(e){let t=lazy(e);return jsx(Suspense,{fallback:jsx(T,{}),children:jsx(t,{})})}var B=a(()=>import('./root-VSTE2THV.js').then(e=>({default:e.Root}))),J=a(()=>import('./list-GALFFS5F.js').then(e=>({default:e.List}))),W=a(()=>import('./edit-entity-PVT34FD7.js').then(e=>({default:e.EditEntity}))),X=a(()=>import('./root-5TCUJI6Q.js').then(e=>({default:e.Root}))),q=a(()=>import('./root-SMHRBFGW.js').then(e=>({default:e.Root}))),K=a(()=>import('./root-VYZYDWIB.js').then(e=>({default:e.Root}))),$=a(()=>import('./plugin-pages-Q63UBSKH.js').then(e=>({default:e.PluginsPage}))),G=a(()=>import('./plugin-pages-Q63UBSKH.js').then(e=>({default:e.InstalledPluginsPage}))),Q=a(()=>import('./plugin-pages-Q63UBSKH.js').then(e=>({default:e.PluginDetailPage}))),v=a(()=>import('./chat-page-ZFPMTRLD.js').then(e=>({default:e.AgentChatPage}))),Y=a(()=>import('./pages-IA7GOMMS.js').then(e=>({default:e.AutomationsPage}))),ee=a(()=>import('./pages-IA7GOMMS.js').then(e=>({default:e.RunHistoryPage}))),te=a(()=>import('./pages-IA7GOMMS.js').then(e=>({default:e.ApprovalsPage}))),oe=a(()=>import('./pages-IA7GOMMS.js').then(e=>({default:e.CreateAutomationPage}))),ae=a(()=>import('./pages-IA7GOMMS.js').then(e=>({default:e.AutomationDetailPage}))),ne=a(()=>import('./pages-IA7GOMMS.js').then(e=>({default:e.RunsPage}))),ie=a(()=>import('./pages-IA7GOMMS.js').then(e=>({default:e.RunDetailPage}))),re=a(()=>import('./skills-pages-KDG2NOQJ.js').then(e=>({default:e.SkillsPage}))),se=a(()=>import('./skills-pages-KDG2NOQJ.js').then(e=>({default:e.CreateSkillPage}))),pe=a(()=>import('./skills-pages-KDG2NOQJ.js').then(e=>({default:e.SkillDetailPage}))),l=[{name:"desk",icon:jsx(Layout,{strokeWidth:1.5}),title:"Desk",component:B,routes:[{path:"list/:entity",component:J,children:[{path:"edit/:id",component:W}]}]},{name:"asset-manager",icon:jsx(FileStack,{strokeWidth:1.5}),title:"Asset Manager",component:X,routes:[]},{name:"explorer",icon:jsx(SquarePlay,{strokeWidth:1.5}),title:"Explorer",component:q,routes:[]},{name:"ai",icon:jsx(Bot,{strokeWidth:1.5}),title:"AI",component:K,routes:[{path:"plugins",component:$},{path:"plugins/installed",component:G},{path:"plugins/:pluginId",component:Q},{component:jsx(_,{replace:true,to:"agent"}),path:""},{component:v,path:"agent"},{component:v,path:"agent/chats/:chatId"},{component:Y,path:"automations"},{component:ee,path:"runs"},{component:te,path:"approvals"},{component:oe,path:"automations/new"},{component:ae,path:"automations/:automationId"},{component:ne,path:"automations/:automationId/runs"},{component:ie,path:"automations/:automationId/runs/:runId"},{component:re,path:"skills"},{component:se,path:"skills/new"},{component:pe,path:"skills/:skillId"}]}];async function b(e$1){try{let t=await fetch(e(e$1).schema,{credentials:"include",mode:"cors"});if(!t.ok){let n=t.statusText||`Request failed with status ${String(t.status)}`;try{let i=await t.json();n=i.error??i.message??n;}catch{}return {ok:!1,projectId:e$1,error:{status:t.status,message:n}}}let o=await t.json();return {ok:!0,project:{...o,projectId:o.projectId||e$1}}}catch(t){return {ok:false,projectId:e$1,error:{status:0,message:t instanceof Error?t.message:"Network error"}}}}function w(e,t){let o=[],n={};for(let i of e??[])i.ok?o.push(i.project):n[i.projectId]=i.error;return {projects:o,errors:n,isLoading:t}}function L(e,t){let o=t&&e.length>0?["project-schemas",t,...e]:null,{data:n,isLoading:i}=C(o,()=>Promise.all(e.map(s=>b(s))),{revalidateOnFocus:false,revalidateOnReconnect:false});return w(n,!!o&&(i||n===void 0))}function le(e,t){return w(e?[e]:void 0,t)}function A(e,t){let o=t&&e?["project-schema",t,e]:null,{data:n,isLoading:i}=C(o,()=>b(e??""),{revalidateOnFocus:false,revalidateOnReconnect:false});return le(n,!!o&&(i||n===void 0))}function me(e,t){return Array.isArray(e)&&(e[0]==="project-schema"||e[0]==="project-schemas")&&e.slice(2).includes(t)}function Ee(e){return mutate(t=>me(t,e))}var R=createContext({mode:"projects",apps:l,contributions:{apps:l},currentProjectId:void 0,currentProject:void 0,currentProjectSchema:[],projects:[],projectIds:[],projectSummaries:[],schemaErrors:{},isLoadingSchemas:false});function ge(e){return [...e.filter(o=>o.name!==d.name&&o.name!==f.name),d,f]}function Ue({projectIds:e,projectSummaries:t=[],mode:o="projects",userId:n,children:i}){let{projectId:s}=useParams(),[,I]=h(),h$1=I.user?.id??n,V=L(o==="projects"?e:[],h$1),O=A(o==="hosted"&&s&&e.includes(s)?s:void 0,h$1),{projects:y,errors:P,isLoading:S}=o==="hosted"?O:V,m=useMemo(()=>e.map(r=>y.find(u=>u.projectId===r)).filter(r=>r!==void 0).map(r=>({...r,schema:ge(r.schema)})),[y,e]),H=useMemo(()=>{let r=m.find(u=>u.projectId===s);return {mode:o,apps:l,contributions:{apps:l},currentProjectId:s,currentProject:r,currentProjectSchema:r?.schema??[],projects:m,projectIds:e,projectSummaries:t,schemaErrors:P,isLoadingSchemas:S}},[s,P,S,o,e,t,m]);return jsx(R.Provider,{value:H,children:i})}function Ne(){return useContext(R)}
2
- export{T as a,d as b,f as c,Ee as d,l as e,Ue as f,Ne as g};//# sourceMappingURL=chunk-DPCMOWK4.js.map
3
- //# sourceMappingURL=chunk-DPCMOWK4.js.map
1
+ import'./index.css';import {h,e}from'./chunk-NNA4MLFC.js';import {b as b$1}from'./chunk-5DHOBLAE.js';import {createContext,lazy,Suspense,useMemo,useContext}from'react';import {Navigate,useParams}from'react-router-dom';import {Layout,FileStack,SquarePlay,Bot}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';import C,{mutate}from'swr';var d={name:"_asset",plural:"_assets",display:"originalFilename",menu:{hidden:true},attributes:[{name:"path",label:"Asset",scope:"global",options:{size:140},dataType:"string",inputType:"text",previewType:"assetPreviewField",defaultValue:""},{name:"originalFilename",label:"Filename",scope:"global",options:{size:320},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"size",label:"Size",scope:"global",options:{size:120},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"width",label:"Width",scope:"global",options:{size:90},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"height",label:"Height",scope:"global",options:{size:100},dataType:"int",inputType:"text",previewType:"text",defaultValue:""},{name:"mimeType",label:"Mime Type",scope:"global",options:{size:160},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"lqip",label:"lqip",scope:"global",hidden:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"url",label:"URL",scope:"global",hidden:true,readOnly:true,dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"tags",label:"Tags",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",previewType:"tags",options:{size:300},relationship:{mode:"multiple",field:"name",entity:"_tag"}}]};var f={name:"_tag",plural:"_tags",display:"name",menu:{hidden:true},attributes:[{name:"name",label:"Tag Name",scope:"global",options:{size:220},dataType:"string",inputType:"text",previewType:"text",defaultValue:""},{name:"_updatedAt",label:"Updated At",scope:"global",options:{size:220},readOnly:true,hidden:true,dataType:"datetime",inputType:"datetime",previewType:"datetime",defaultValue:""},{name:"assets",label:"Assets",scope:"relationship",dataType:"string",inputType:"relationship",defaultValue:"",relationship:{mode:"multiple",field:"originalFilename",entity:"_asset"}}]};function T(){let{resolvedTheme:e}=b$1();return jsx("div",{className:"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background",children:jsxs("div",{className:"fk:flex fk:flex-col fk:items-center",children:[e==="dark"?jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"#020817"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"white"})]}):jsxs("svg",{className:"fk:h-8 fk:w-8 fk:animate-bounce",fill:"none",viewBox:"0 0 48 48",xmlns:"http://www.w3.org/2000/svg",children:[jsx("path",{d:"M7 8H41V40H7V8Z",fill:"white"}),jsx("path",{d:"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z",fill:"#020817"})]}),jsx("div",{className:"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse",children:"Loading..."})]})})}var _=Navigate;function a(e){let t=lazy(e);return jsx(Suspense,{fallback:jsx(T,{}),children:jsx(t,{})})}var B=a(()=>import('./root-HC5QZ2JM.js').then(e=>({default:e.Root}))),J=a(()=>import('./list-ZQJ6NHKQ.js').then(e=>({default:e.List}))),W=a(()=>import('./edit-entity-PVT34FD7.js').then(e=>({default:e.EditEntity}))),X=a(()=>import('./root-TXKDRPOK.js').then(e=>({default:e.Root}))),q=a(()=>import('./root-BD4VN3RD.js').then(e=>({default:e.Root}))),K=a(()=>import('./root-P6CVZ5ZB.js').then(e=>({default:e.Root}))),$=a(()=>import('./plugin-pages-E5TUDDT5.js').then(e=>({default:e.PluginsPage}))),G=a(()=>import('./plugin-pages-E5TUDDT5.js').then(e=>({default:e.InstalledPluginsPage}))),Q=a(()=>import('./plugin-pages-E5TUDDT5.js').then(e=>({default:e.PluginDetailPage}))),v=a(()=>import('./chat-page-H6I3XOKS.js').then(e=>({default:e.AgentChatPage}))),Y=a(()=>import('./pages-2GQVTLL2.js').then(e=>({default:e.AutomationsPage}))),ee=a(()=>import('./pages-2GQVTLL2.js').then(e=>({default:e.RunHistoryPage}))),te=a(()=>import('./pages-2GQVTLL2.js').then(e=>({default:e.ApprovalsPage}))),oe=a(()=>import('./pages-2GQVTLL2.js').then(e=>({default:e.CreateAutomationPage}))),ae=a(()=>import('./pages-2GQVTLL2.js').then(e=>({default:e.AutomationDetailPage}))),ne=a(()=>import('./pages-2GQVTLL2.js').then(e=>({default:e.RunsPage}))),ie=a(()=>import('./pages-2GQVTLL2.js').then(e=>({default:e.RunDetailPage}))),re=a(()=>import('./skills-pages-N5KDEHLT.js').then(e=>({default:e.SkillsPage}))),se=a(()=>import('./skills-pages-N5KDEHLT.js').then(e=>({default:e.CreateSkillPage}))),pe=a(()=>import('./skills-pages-N5KDEHLT.js').then(e=>({default:e.SkillDetailPage}))),l=[{name:"desk",icon:jsx(Layout,{strokeWidth:1.5}),title:"Desk",component:B,routes:[{path:"list/:entity",component:J,children:[{path:"edit/:id",component:W}]}]},{name:"asset-manager",icon:jsx(FileStack,{strokeWidth:1.5}),title:"Asset Manager",component:X,routes:[]},{name:"explorer",icon:jsx(SquarePlay,{strokeWidth:1.5}),title:"Explorer",component:q,routes:[]},{name:"ai",icon:jsx(Bot,{strokeWidth:1.5}),title:"AI",component:K,routes:[{path:"plugins",component:$},{path:"plugins/installed",component:G},{path:"plugins/:pluginId",component:Q},{component:jsx(_,{replace:true,to:"agent"}),path:""},{component:v,path:"agent"},{component:v,path:"agent/chats/:chatId"},{component:Y,path:"automations"},{component:ee,path:"runs"},{component:te,path:"approvals"},{component:oe,path:"automations/new"},{component:ae,path:"automations/:automationId"},{component:ne,path:"automations/:automationId/runs"},{component:ie,path:"automations/:automationId/runs/:runId"},{component:re,path:"skills"},{component:se,path:"skills/new"},{component:pe,path:"skills/:skillId"}]}];async function b(e$1){try{let t=await fetch(e(e$1).schema,{credentials:"include",mode:"cors"});if(!t.ok){let n=t.statusText||`Request failed with status ${String(t.status)}`;try{let i=await t.json();n=i.error??i.message??n;}catch{}return {ok:!1,projectId:e$1,error:{status:t.status,message:n}}}let o=await t.json();return {ok:!0,project:{...o,projectId:o.projectId||e$1}}}catch(t){return {ok:false,projectId:e$1,error:{status:0,message:t instanceof Error?t.message:"Network error"}}}}function w(e,t){let o=[],n={};for(let i of e??[])i.ok?o.push(i.project):n[i.projectId]=i.error;return {projects:o,errors:n,isLoading:t}}function L(e,t){let o=t&&e.length>0?["project-schemas",t,...e]:null,{data:n,isLoading:i}=C(o,()=>Promise.all(e.map(s=>b(s))),{revalidateOnFocus:false,revalidateOnReconnect:false});return w(n,!!o&&(i||n===void 0))}function le(e,t){return w(e?[e]:void 0,t)}function A(e,t){let o=t&&e?["project-schema",t,e]:null,{data:n,isLoading:i}=C(o,()=>b(e??""),{revalidateOnFocus:false,revalidateOnReconnect:false});return le(n,!!o&&(i||n===void 0))}function me(e,t){return Array.isArray(e)&&(e[0]==="project-schema"||e[0]==="project-schemas")&&e.slice(2).includes(t)}function Ee(e){return mutate(t=>me(t,e))}var R=createContext({mode:"projects",apps:l,contributions:{apps:l},currentProjectId:void 0,currentProject:void 0,currentProjectSchema:[],projects:[],projectIds:[],projectSummaries:[],schemaErrors:{},isLoadingSchemas:false});function ge(e){return [...e.filter(o=>o.name!==d.name&&o.name!==f.name),d,f]}function Ue({projectIds:e,projectSummaries:t=[],mode:o="projects",userId:n,children:i}){let{projectId:s}=useParams(),[,I]=h(),h$1=I.user?.id??n,V=L(o==="projects"?e:[],h$1),O=A(o==="hosted"&&s&&e.includes(s)?s:void 0,h$1),{projects:y,errors:P,isLoading:S}=o==="hosted"?O:V,m=useMemo(()=>e.map(r=>y.find(u=>u.projectId===r)).filter(r=>r!==void 0).map(r=>({...r,schema:ge(r.schema)})),[y,e]),H=useMemo(()=>{let r=m.find(u=>u.projectId===s);return {mode:o,apps:l,contributions:{apps:l},currentProjectId:s,currentProject:r,currentProjectSchema:r?.schema??[],projects:m,projectIds:e,projectSummaries:t,schemaErrors:P,isLoadingSchemas:S}},[s,P,S,o,e,t,m]);return jsx(R.Provider,{value:H,children:i})}function Ne(){return useContext(R)}
2
+ export{T as a,d as b,f as c,Ee as d,l as e,Ue as f,Ne as g};//# sourceMappingURL=chunk-ZBI744KS.js.map
3
+ //# sourceMappingURL=chunk-ZBI744KS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/entities/assets-schema.ts","../src/entities/tags-schema.ts","../src/ui/components/loading.tsx","../src/core/apps/built-in-apps.tsx","../src/core/config/use-project-schemas.ts","../src/core/config/config-context.tsx"],"names":["assetSchema","tagSchema","Loading","resolvedTheme","useTheme","jsx","jsxs","NavigateCompat","Navigate","lazyElement","loader","Component","lazy","Suspense","deskRoot","m","deskList","deskEditEntity","assetManagerRoot","explorerRoot","aiRoot","aiPluginsPage","aiInstalledPluginsPage","aiPluginDetailPage","aiAgentChatPage","aiAutomationsPage","aiRunHistoryPage","aiApprovalsPage","aiCreateAutomationPage","aiAutomationDetailPage","aiRunsPage","aiRunDetailPage","aiSkillsPage","aiCreateSkillPage","aiSkillDetailPage","builtInApps","LayoutIcon","FileStackIcon","SquarePlayIcon","BotIcon","fetchProjectSchema","projectId","response","apiPaths","message","body","project","error","toProjectSchemasState","outcomes","isLoading","projects","errors","outcome","useProjectSchemas","projectIds","userId","key","data","useSWR","toProjectSchemaState","useProjectSchema","isProjectSchemaKey","revalidateProjectSchema","mutate","ConfigContext","createContext","upsertReservedEntities","schema","entity","ConfigProvider","projectSummaries","mode","children","currentProjectId","useParams","auth","useAuth","schemaUserId","allSchemas","currentSchema","loadedProjects","useMemo","value","currentProject","useConfig","useContext"],"mappings":"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","file":"chunk-DPCMOWK4.js","sourcesContent":["import type { Entity } from '../core/types';\n\nexport const assetSchema: Entity = {\n name: '_asset',\n plural: '_assets',\n display: 'originalFilename',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'path',\n label: 'Asset',\n scope: 'global',\n options: {\n size: 140,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'assetPreviewField',\n defaultValue: '',\n },\n {\n name: 'originalFilename',\n label: 'Filename',\n scope: 'global',\n options: {\n size: 320,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'size',\n label: 'Size',\n scope: 'global',\n options: {\n size: 120,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'width',\n label: 'Width',\n scope: 'global',\n options: {\n size: 90,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'height',\n label: 'Height',\n scope: 'global',\n options: {\n size: 100,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'mimeType',\n label: 'Mime Type',\n scope: 'global',\n options: {\n size: 160,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'lqip',\n label: 'lqip',\n scope: 'global',\n hidden: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'url',\n label: 'URL',\n scope: 'global',\n hidden: true,\n readOnly: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'tags',\n label: 'Tags',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n previewType: 'tags',\n options: {\n size: 300,\n },\n relationship: {\n mode: 'multiple',\n field: 'name',\n entity: '_tag',\n },\n },\n ],\n};\n","import type { Entity } from '../core/types';\n\nexport const tagSchema: Entity = {\n name: '_tag',\n plural: '_tags',\n display: 'name',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'name',\n label: 'Tag Name',\n scope: 'global',\n options: {\n size: 220,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'assets',\n label: 'Assets',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n relationship: {\n mode: 'multiple',\n field: 'originalFilename',\n entity: '_asset',\n },\n },\n ],\n};\n","import type { JSX } from 'react';\nimport { useTheme } from '../theme-context';\n\nexport function Loading(): JSX.Element {\n const { resolvedTheme } = useTheme();\n\n return (\n <div className=\"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background\">\n <div className=\"fk:flex fk:flex-col fk:items-center\">\n {resolvedTheme === 'dark' ? (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"#020817\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"white\"\n />\n </svg>\n ) : (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"white\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"#020817\"\n />\n </svg>\n )}\n <div className=\"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse\">Loading...</div>\n </div>\n </div>\n );\n}\n","import { lazy, Suspense } from 'react';\nimport type { ComponentType, JSX } from 'react';\nimport {\n Bot as BotIcon,\n FileStack as FileStackIcon,\n Layout as LayoutIcon,\n SquarePlay as SquarePlayIcon,\n} from 'lucide-react';\nimport { Navigate } from 'react-router-dom';\nimport { Loading } from '../../ui/components/loading';\nimport type { AppOptions } from '../config/types';\n\nconst NavigateCompat = Navigate as unknown as ComponentType<{\n replace?: boolean;\n to: string;\n}>;\n\n/**\n * Wraps a lazily imported component in Suspense so each built-in app (and each of its routes)\n * is only downloaded when it is first rendered.\n */\nfunction lazyElement(loader: () => Promise<{ default: ComponentType }>): JSX.Element {\n const Component = lazy(loader);\n\n return (\n <Suspense fallback={<Loading />}>\n <Component />\n </Suspense>\n );\n}\n\n// Desk\nconst deskRoot = lazyElement(() => import('../../apps/desk/root').then((m) => ({ default: m.Root })));\nconst deskList = lazyElement(() => import('../../apps/desk/list').then((m) => ({ default: m.List })));\nconst deskEditEntity = lazyElement(() =>\n import('../../apps/desk/edit-entity').then((m) => ({ default: m.EditEntity }))\n);\n\n// Asset Manager\nconst assetManagerRoot = lazyElement(() =>\n import('../../apps/asset-manager/root').then((m) => ({ default: m.Root }))\n);\n\n// Explorer\nconst explorerRoot = lazyElement(() => import('../../apps/explorer/root').then((m) => ({ default: m.Root })));\n\n// AI\nconst aiRoot = lazyElement(() => import('../../apps/ai/root').then((m) => ({ default: m.Root })));\nconst aiPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginsPage }))\n);\nconst aiInstalledPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.InstalledPluginsPage }))\n);\nconst aiPluginDetailPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginDetailPage }))\n);\nconst aiAgentChatPage = lazyElement(() =>\n import('../../apps/ai/agent/chat-page').then((m) => ({ default: m.AgentChatPage }))\n);\nconst aiAutomationsPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationsPage }))\n);\nconst aiRunHistoryPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.RunHistoryPage }))\n);\nconst aiApprovalsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ApprovalsPage })));\nconst aiCreateAutomationPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.CreateAutomationPage }))\n);\nconst aiAutomationDetailPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationDetailPage }))\n);\nconst aiRunsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunsPage })));\nconst aiRunDetailPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunDetailPage })));\nconst aiSkillsPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillsPage }))\n);\nconst aiCreateSkillPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.CreateSkillPage }))\n);\nconst aiSkillDetailPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillDetailPage }))\n);\n\nexport const builtInApps: AppOptions[] = [\n {\n name: 'desk',\n icon: <LayoutIcon strokeWidth={1.5} />,\n title: 'Desk',\n component: deskRoot,\n routes: [\n {\n path: 'list/:entity',\n component: deskList,\n children: [\n {\n path: 'edit/:id',\n component: deskEditEntity, // Not used, left here as an example of how to nest routes in apps\n },\n ],\n },\n ],\n },\n {\n name: 'asset-manager',\n icon: <FileStackIcon strokeWidth={1.5} />,\n title: 'Asset Manager',\n component: assetManagerRoot,\n routes: [],\n },\n {\n name: 'explorer',\n icon: <SquarePlayIcon strokeWidth={1.5} />,\n title: 'Explorer',\n component: explorerRoot,\n routes: [],\n },\n {\n name: 'ai',\n icon: <BotIcon strokeWidth={1.5} />,\n title: 'AI',\n component: aiRoot,\n routes: [\n { path: 'plugins', component: aiPluginsPage },\n { path: 'plugins/installed', component: aiInstalledPluginsPage },\n { path: 'plugins/:pluginId', component: aiPluginDetailPage },\n {\n component: <NavigateCompat replace to=\"agent\" />,\n path: '',\n },\n {\n component: aiAgentChatPage,\n path: 'agent',\n },\n {\n component: aiAgentChatPage,\n path: 'agent/chats/:chatId',\n },\n {\n component: aiAutomationsPage,\n path: 'automations',\n },\n {\n component: aiRunHistoryPage,\n path: 'runs',\n },\n {\n component: aiApprovalsPage,\n path: 'approvals',\n },\n {\n component: aiCreateAutomationPage,\n path: 'automations/new',\n },\n {\n component: aiAutomationDetailPage,\n path: 'automations/:automationId',\n },\n {\n component: aiRunsPage,\n path: 'automations/:automationId/runs',\n },\n {\n component: aiRunDetailPage,\n path: 'automations/:automationId/runs/:runId',\n },\n {\n component: aiSkillsPage,\n path: 'skills',\n },\n {\n component: aiCreateSkillPage,\n path: 'skills/new',\n },\n {\n component: aiSkillDetailPage,\n path: 'skills/:skillId',\n },\n ],\n },\n];\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { apiPaths } from '../api-paths';\nimport type { ProjectSchemaError, ProjectUiConfig } from './types';\n\nexport type ProjectSchemasState = {\n projects: ProjectUiConfig[];\n errors: { [projectId: string]: ProjectSchemaError };\n isLoading: boolean;\n};\n\ntype FetchOutcome = { ok: true; project: ProjectUiConfig } | { ok: false; projectId: string; error: ProjectSchemaError };\n\nasync function fetchProjectSchema(projectId: string): Promise<FetchOutcome> {\n try {\n const response = await fetch(apiPaths(projectId).schema, { credentials: 'include', mode: 'cors' });\n\n if (!response.ok) {\n let message = response.statusText || `Request failed with status ${String(response.status)}`;\n\n try {\n const body = (await response.json()) as { error?: string; message?: string };\n message = body.error ?? body.message ?? message;\n } catch {\n // keep the status text\n }\n\n return { ok: false, projectId, error: { status: response.status, message } };\n }\n\n const project = (await response.json()) as ProjectUiConfig;\n\n return { ok: true, project: { ...project, projectId: project.projectId || projectId } };\n } catch (error) {\n return {\n ok: false,\n projectId,\n error: { status: 0, message: error instanceof Error ? error.message : 'Network error' },\n };\n }\n}\n\nexport function toProjectSchemasState(outcomes: FetchOutcome[] | undefined, isLoading: boolean): ProjectSchemasState {\n const projects: ProjectUiConfig[] = [];\n const errors: { [projectId: string]: ProjectSchemaError } = {};\n\n for (const outcome of outcomes ?? []) {\n if (outcome.ok) {\n projects.push(outcome.project);\n } else {\n errors[outcome.projectId] = outcome.error;\n }\n }\n\n return { projects, errors, isLoading };\n}\n\n/**\n * Loads the deployed schema of every project the Studio can open. Fetching\n * starts once the user is known (the endpoint needs a session) and the result\n * is kept for the lifetime of the page: schemas only change on deploy.\n */\nexport function useProjectSchemas(projectIds: string[], userId: string | undefined): ProjectSchemasState {\n const key = userId && projectIds.length > 0 ? ['project-schemas', userId, ...projectIds] : null;\n const { data, isLoading } = useSWR(key, () => Promise.all(projectIds.map((projectId) => fetchProjectSchema(projectId))), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemasState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** State of a single project's schema, in the same shape as the multi-project hook. */\nexport function toProjectSchemaState(outcome: FetchOutcome | undefined, isLoading: boolean): ProjectSchemasState {\n return toProjectSchemasState(outcome ? [outcome] : undefined, isLoading);\n}\n\n/**\n * Hosted mode: loads only the project currently open. Each project has its own\n * SWR key, so switching back to a project reuses the schema already fetched.\n */\nexport function useProjectSchema(projectId: string | undefined, userId: string | undefined): ProjectSchemasState {\n const key = userId && projectId ? ['project-schema', userId, projectId] : null;\n const { data, isLoading } = useSWR(key, () => fetchProjectSchema(projectId ?? ''), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemaState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** True for the SWR keys that hold `projectId`'s schema (single- and multi-project hooks). */\nexport function isProjectSchemaKey(key: unknown, projectId: string): boolean {\n return (\n Array.isArray(key) &&\n (key[0] === 'project-schema' || key[0] === 'project-schemas') &&\n key.slice(2).includes(projectId)\n );\n}\n\n/** Refetches the deployed schema of `projectId`, e.g. after the agent deployed a schema change. */\nexport function revalidateProjectSchema(projectId: string): Promise<unknown> {\n return mutate((key) => isProjectSchemaKey(key, projectId));\n}\n","'use client';\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { tagSchema } from '../../entities/tags-schema';\nimport { builtInApps } from '../apps/built-in-apps';\nimport type { AppOptions, ProjectSchemaError, ProjectSummary, ProjectUiConfig, StudioMode } from './types';\nimport type { Entity } from '../types';\nimport { useProjectSchema, useProjectSchemas } from './use-project-schemas';\n\nexport interface ConfigContext {\n /** `projects` when the host passed `projectIds`, `hosted` when the Studio listed the user's projects itself. */\n mode: StudioMode;\n /** The Studio apps shown in the app bar, in order. */\n apps: AppOptions[];\n /** Kept for callers that read `contributions.apps`; same list as `apps`. */\n contributions: {\n apps: AppOptions[];\n };\n currentProjectId?: string;\n /** The project named by the `:projectId` route param, once its schema has loaded. */\n currentProject?: ProjectUiConfig;\n currentProjectSchema: Entity[];\n /** Projects whose schema loaded, in `projectIds` order. */\n projects: ProjectUiConfig[];\n /** Every project id the Studio can open, loaded or not. */\n projectIds: string[];\n /** Hosted mode: name, avatar, role and team of each project, known before any schema loads. */\n projectSummaries: ProjectSummary[];\n /** Per project id: why its schema could not be loaded. */\n schemaErrors: { [projectId: string]: ProjectSchemaError };\n isLoadingSchemas: boolean;\n}\n\nconst ConfigContext = createContext<ConfigContext>({\n mode: 'projects',\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId: undefined,\n currentProject: undefined,\n currentProjectSchema: [],\n projects: [],\n projectIds: [],\n projectSummaries: [],\n schemaErrors: {},\n isLoadingSchemas: false,\n});\n\n/** Appends the reserved asset and tag entities to a deployed schema. */\nexport function upsertReservedEntities(schema: Entity[]): Entity[] {\n const withoutReserved = schema.filter((entity) => entity.name !== assetSchema.name && entity.name !== tagSchema.name);\n\n return [...withoutReserved, assetSchema, tagSchema];\n}\n\nexport function ConfigProvider({\n projectIds,\n projectSummaries = [],\n mode = 'projects',\n userId,\n children,\n}: {\n projectIds: string[];\n projectSummaries?: ProjectSummary[];\n mode?: StudioMode;\n /** Hosted mode: the signed-in user's id, known before the per-project `/users/me` call. */\n userId?: string;\n children: React.ReactNode;\n}): JSX.Element {\n /**\n * Getting the projectId from the URL via react-router-dom's useParams hook triggers a rerender of this Context\n * every time the URL changes.\n */\n const { projectId: currentProjectId } = useParams<{ projectId: string }>();\n const [, auth] = useAuth();\n const schemaUserId = auth.user?.id ?? userId;\n // Project mode loads every project up front (short, host-defined list); hosted mode only the one open.\n const allSchemas = useProjectSchemas(mode === 'projects' ? projectIds : [], schemaUserId);\n const currentSchema = useProjectSchema(\n mode === 'hosted' && currentProjectId && projectIds.includes(currentProjectId) ? currentProjectId : undefined,\n schemaUserId\n );\n const { projects: loadedProjects, errors, isLoading } = mode === 'hosted' ? currentSchema : allSchemas;\n const projects = useMemo(\n () =>\n projectIds\n .map((projectId) => loadedProjects.find((project) => project.projectId === projectId))\n .filter((project): project is ProjectUiConfig => project !== undefined)\n .map((project) => ({ ...project, schema: upsertReservedEntities(project.schema) })),\n [loadedProjects, projectIds]\n );\n\n const value = useMemo<ConfigContext>(() => {\n const currentProject = projects.find((project) => project.projectId === currentProjectId);\n\n return {\n mode,\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId,\n currentProject,\n currentProjectSchema: currentProject?.schema ?? [],\n projects,\n projectIds,\n projectSummaries,\n schemaErrors: errors,\n isLoadingSchemas: isLoading,\n };\n }, [currentProjectId, errors, isLoading, mode, projectIds, projectSummaries, projects]);\n\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n}\n\nexport function useConfig(): ConfigContext {\n return useContext(ConfigContext);\n}\n"]}
1
+ {"version":3,"sources":["../src/entities/assets-schema.ts","../src/entities/tags-schema.ts","../src/ui/components/loading.tsx","../src/core/apps/built-in-apps.tsx","../src/core/config/use-project-schemas.ts","../src/core/config/config-context.tsx"],"names":["assetSchema","tagSchema","Loading","resolvedTheme","useTheme","jsx","jsxs","NavigateCompat","Navigate","lazyElement","loader","Component","lazy","Suspense","deskRoot","m","deskList","deskEditEntity","assetManagerRoot","explorerRoot","aiRoot","aiPluginsPage","aiInstalledPluginsPage","aiPluginDetailPage","aiAgentChatPage","aiAutomationsPage","aiRunHistoryPage","aiApprovalsPage","aiCreateAutomationPage","aiAutomationDetailPage","aiRunsPage","aiRunDetailPage","aiSkillsPage","aiCreateSkillPage","aiSkillDetailPage","builtInApps","LayoutIcon","FileStackIcon","SquarePlayIcon","BotIcon","fetchProjectSchema","projectId","response","apiPaths","message","body","project","error","toProjectSchemasState","outcomes","isLoading","projects","errors","outcome","useProjectSchemas","projectIds","userId","key","data","useSWR","toProjectSchemaState","useProjectSchema","isProjectSchemaKey","revalidateProjectSchema","mutate","ConfigContext","createContext","upsertReservedEntities","schema","entity","ConfigProvider","projectSummaries","mode","children","currentProjectId","useParams","auth","useAuth","schemaUserId","allSchemas","currentSchema","loadedProjects","useMemo","value","currentProject","useConfig","useContext"],"mappings":"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","file":"chunk-ZBI744KS.js","sourcesContent":["import type { Entity } from '../core/types';\n\nexport const assetSchema: Entity = {\n name: '_asset',\n plural: '_assets',\n display: 'originalFilename',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'path',\n label: 'Asset',\n scope: 'global',\n options: {\n size: 140,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'assetPreviewField',\n defaultValue: '',\n },\n {\n name: 'originalFilename',\n label: 'Filename',\n scope: 'global',\n options: {\n size: 320,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'size',\n label: 'Size',\n scope: 'global',\n options: {\n size: 120,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'width',\n label: 'Width',\n scope: 'global',\n options: {\n size: 90,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'height',\n label: 'Height',\n scope: 'global',\n options: {\n size: 100,\n },\n dataType: 'int',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'mimeType',\n label: 'Mime Type',\n scope: 'global',\n options: {\n size: 160,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'lqip',\n label: 'lqip',\n scope: 'global',\n hidden: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: 'url',\n label: 'URL',\n scope: 'global',\n hidden: true,\n readOnly: true,\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'tags',\n label: 'Tags',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n previewType: 'tags',\n options: {\n size: 300,\n },\n relationship: {\n mode: 'multiple',\n field: 'name',\n entity: '_tag',\n },\n },\n ],\n};\n","import type { Entity } from '../core/types';\n\nexport const tagSchema: Entity = {\n name: '_tag',\n plural: '_tags',\n display: 'name',\n menu: {\n hidden: true,\n },\n attributes: [\n {\n name: 'name',\n label: 'Tag Name',\n scope: 'global',\n options: {\n size: 220,\n },\n dataType: 'string',\n inputType: 'text',\n previewType: 'text',\n defaultValue: '',\n },\n {\n name: '_updatedAt',\n label: 'Updated At',\n scope: 'global',\n options: {\n size: 220,\n },\n readOnly: true,\n hidden: true,\n dataType: 'datetime',\n inputType: 'datetime',\n previewType: 'datetime',\n defaultValue: '',\n },\n {\n name: 'assets',\n label: 'Assets',\n scope: 'relationship',\n dataType: 'string',\n inputType: 'relationship',\n defaultValue: '',\n relationship: {\n mode: 'multiple',\n field: 'originalFilename',\n entity: '_asset',\n },\n },\n ],\n};\n","import type { JSX } from 'react';\nimport { useTheme } from '../theme-context';\n\nexport function Loading(): JSX.Element {\n const { resolvedTheme } = useTheme();\n\n return (\n <div className=\"fk:flex fk:w-full fk:h-full fk:justify-center fk:items-center fk:bg-background\">\n <div className=\"fk:flex fk:flex-col fk:items-center\">\n {resolvedTheme === 'dark' ? (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"#020817\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"white\"\n />\n </svg>\n ) : (\n <svg\n className=\"fk:h-8 fk:w-8 fk:animate-bounce\"\n fill=\"none\"\n viewBox=\"0 0 48 48\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7 8H41V40H7V8Z\" fill=\"white\" />\n <path\n d=\"M24 0C42 0 48 6 48 24C48 42 42 48 24 48C6 48 0 42 0 24C0 6 6 0 24 0ZM17.7494 9.52381H8.7619L19.2833 23.8313L8.7619 38.7078H17.7494L21.0499 33.6639V14.2549L17.7494 9.52381ZM38.9577 9.52381H29.9542L26.2857 14.8229V33.0406L29.9542 38.7078H38.9577L28.3908 23.8313L38.9577 9.52381Z\"\n fill=\"#020817\"\n />\n </svg>\n )}\n <div className=\"fk:text-foreground fk:text-center fk:mt-4 fk:animate-pulse\">Loading...</div>\n </div>\n </div>\n );\n}\n","import { lazy, Suspense } from 'react';\nimport type { ComponentType, JSX } from 'react';\nimport {\n Bot as BotIcon,\n FileStack as FileStackIcon,\n Layout as LayoutIcon,\n SquarePlay as SquarePlayIcon,\n} from 'lucide-react';\nimport { Navigate } from 'react-router-dom';\nimport { Loading } from '../../ui/components/loading';\nimport type { AppOptions } from '../config/types';\n\nconst NavigateCompat = Navigate as unknown as ComponentType<{\n replace?: boolean;\n to: string;\n}>;\n\n/**\n * Wraps a lazily imported component in Suspense so each built-in app (and each of its routes)\n * is only downloaded when it is first rendered.\n */\nfunction lazyElement(loader: () => Promise<{ default: ComponentType }>): JSX.Element {\n const Component = lazy(loader);\n\n return (\n <Suspense fallback={<Loading />}>\n <Component />\n </Suspense>\n );\n}\n\n// Desk\nconst deskRoot = lazyElement(() => import('../../apps/desk/root').then((m) => ({ default: m.Root })));\nconst deskList = lazyElement(() => import('../../apps/desk/list').then((m) => ({ default: m.List })));\nconst deskEditEntity = lazyElement(() =>\n import('../../apps/desk/edit-entity').then((m) => ({ default: m.EditEntity }))\n);\n\n// Asset Manager\nconst assetManagerRoot = lazyElement(() =>\n import('../../apps/asset-manager/root').then((m) => ({ default: m.Root }))\n);\n\n// Explorer\nconst explorerRoot = lazyElement(() => import('../../apps/explorer/root').then((m) => ({ default: m.Root })));\n\n// AI\nconst aiRoot = lazyElement(() => import('../../apps/ai/root').then((m) => ({ default: m.Root })));\nconst aiPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginsPage }))\n);\nconst aiInstalledPluginsPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.InstalledPluginsPage }))\n);\nconst aiPluginDetailPage = lazyElement(() =>\n import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginDetailPage }))\n);\nconst aiAgentChatPage = lazyElement(() =>\n import('../../apps/ai/agent/chat-page').then((m) => ({ default: m.AgentChatPage }))\n);\nconst aiAutomationsPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationsPage }))\n);\nconst aiRunHistoryPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.RunHistoryPage }))\n);\nconst aiApprovalsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ApprovalsPage })));\nconst aiCreateAutomationPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.CreateAutomationPage }))\n);\nconst aiAutomationDetailPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.AutomationDetailPage }))\n);\nconst aiRunsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunsPage })));\nconst aiRunDetailPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunDetailPage })));\nconst aiSkillsPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillsPage }))\n);\nconst aiCreateSkillPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.CreateSkillPage }))\n);\nconst aiSkillDetailPage = lazyElement(() =>\n import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillDetailPage }))\n);\n\nexport const builtInApps: AppOptions[] = [\n {\n name: 'desk',\n icon: <LayoutIcon strokeWidth={1.5} />,\n title: 'Desk',\n component: deskRoot,\n routes: [\n {\n path: 'list/:entity',\n component: deskList,\n children: [\n {\n path: 'edit/:id',\n component: deskEditEntity, // Not used, left here as an example of how to nest routes in apps\n },\n ],\n },\n ],\n },\n {\n name: 'asset-manager',\n icon: <FileStackIcon strokeWidth={1.5} />,\n title: 'Asset Manager',\n component: assetManagerRoot,\n routes: [],\n },\n {\n name: 'explorer',\n icon: <SquarePlayIcon strokeWidth={1.5} />,\n title: 'Explorer',\n component: explorerRoot,\n routes: [],\n },\n {\n name: 'ai',\n icon: <BotIcon strokeWidth={1.5} />,\n title: 'AI',\n component: aiRoot,\n routes: [\n { path: 'plugins', component: aiPluginsPage },\n { path: 'plugins/installed', component: aiInstalledPluginsPage },\n { path: 'plugins/:pluginId', component: aiPluginDetailPage },\n {\n component: <NavigateCompat replace to=\"agent\" />,\n path: '',\n },\n {\n component: aiAgentChatPage,\n path: 'agent',\n },\n {\n component: aiAgentChatPage,\n path: 'agent/chats/:chatId',\n },\n {\n component: aiAutomationsPage,\n path: 'automations',\n },\n {\n component: aiRunHistoryPage,\n path: 'runs',\n },\n {\n component: aiApprovalsPage,\n path: 'approvals',\n },\n {\n component: aiCreateAutomationPage,\n path: 'automations/new',\n },\n {\n component: aiAutomationDetailPage,\n path: 'automations/:automationId',\n },\n {\n component: aiRunsPage,\n path: 'automations/:automationId/runs',\n },\n {\n component: aiRunDetailPage,\n path: 'automations/:automationId/runs/:runId',\n },\n {\n component: aiSkillsPage,\n path: 'skills',\n },\n {\n component: aiCreateSkillPage,\n path: 'skills/new',\n },\n {\n component: aiSkillDetailPage,\n path: 'skills/:skillId',\n },\n ],\n },\n];\n","'use client';\n\nimport useSWR, { mutate } from 'swr';\nimport { apiPaths } from '../api-paths';\nimport type { ProjectSchemaError, ProjectUiConfig } from './types';\n\nexport type ProjectSchemasState = {\n projects: ProjectUiConfig[];\n errors: { [projectId: string]: ProjectSchemaError };\n isLoading: boolean;\n};\n\ntype FetchOutcome = { ok: true; project: ProjectUiConfig } | { ok: false; projectId: string; error: ProjectSchemaError };\n\nasync function fetchProjectSchema(projectId: string): Promise<FetchOutcome> {\n try {\n const response = await fetch(apiPaths(projectId).schema, { credentials: 'include', mode: 'cors' });\n\n if (!response.ok) {\n let message = response.statusText || `Request failed with status ${String(response.status)}`;\n\n try {\n const body = (await response.json()) as { error?: string; message?: string };\n message = body.error ?? body.message ?? message;\n } catch {\n // keep the status text\n }\n\n return { ok: false, projectId, error: { status: response.status, message } };\n }\n\n const project = (await response.json()) as ProjectUiConfig;\n\n return { ok: true, project: { ...project, projectId: project.projectId || projectId } };\n } catch (error) {\n return {\n ok: false,\n projectId,\n error: { status: 0, message: error instanceof Error ? error.message : 'Network error' },\n };\n }\n}\n\nexport function toProjectSchemasState(outcomes: FetchOutcome[] | undefined, isLoading: boolean): ProjectSchemasState {\n const projects: ProjectUiConfig[] = [];\n const errors: { [projectId: string]: ProjectSchemaError } = {};\n\n for (const outcome of outcomes ?? []) {\n if (outcome.ok) {\n projects.push(outcome.project);\n } else {\n errors[outcome.projectId] = outcome.error;\n }\n }\n\n return { projects, errors, isLoading };\n}\n\n/**\n * Loads the deployed schema of every project the Studio can open. Fetching\n * starts once the user is known (the endpoint needs a session) and the result\n * is kept for the lifetime of the page: schemas only change on deploy.\n */\nexport function useProjectSchemas(projectIds: string[], userId: string | undefined): ProjectSchemasState {\n const key = userId && projectIds.length > 0 ? ['project-schemas', userId, ...projectIds] : null;\n const { data, isLoading } = useSWR(key, () => Promise.all(projectIds.map((projectId) => fetchProjectSchema(projectId))), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemasState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** State of a single project's schema, in the same shape as the multi-project hook. */\nexport function toProjectSchemaState(outcome: FetchOutcome | undefined, isLoading: boolean): ProjectSchemasState {\n return toProjectSchemasState(outcome ? [outcome] : undefined, isLoading);\n}\n\n/**\n * Hosted mode: loads only the project currently open. Each project has its own\n * SWR key, so switching back to a project reuses the schema already fetched.\n */\nexport function useProjectSchema(projectId: string | undefined, userId: string | undefined): ProjectSchemasState {\n const key = userId && projectId ? ['project-schema', userId, projectId] : null;\n const { data, isLoading } = useSWR(key, () => fetchProjectSchema(projectId ?? ''), {\n revalidateOnFocus: false,\n revalidateOnReconnect: false,\n });\n\n return toProjectSchemaState(data, Boolean(key) && (isLoading || data === undefined));\n}\n\n/** True for the SWR keys that hold `projectId`'s schema (single- and multi-project hooks). */\nexport function isProjectSchemaKey(key: unknown, projectId: string): boolean {\n return (\n Array.isArray(key) &&\n (key[0] === 'project-schema' || key[0] === 'project-schemas') &&\n key.slice(2).includes(projectId)\n );\n}\n\n/** Refetches the deployed schema of `projectId`, e.g. after the agent deployed a schema change. */\nexport function revalidateProjectSchema(projectId: string): Promise<unknown> {\n return mutate((key) => isProjectSchemaKey(key, projectId));\n}\n","'use client';\n\nimport { createContext, useContext, useMemo } from 'react';\nimport type { JSX } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useAuth } from '../../auth/auth-context';\nimport { assetSchema } from '../../entities/assets-schema';\nimport { tagSchema } from '../../entities/tags-schema';\nimport { builtInApps } from '../apps/built-in-apps';\nimport type { AppOptions, ProjectSchemaError, ProjectSummary, ProjectUiConfig, StudioMode } from './types';\nimport type { Entity } from '../types';\nimport { useProjectSchema, useProjectSchemas } from './use-project-schemas';\n\nexport interface ConfigContext {\n /** `projects` when the host passed `projectIds`, `hosted` when the Studio listed the user's projects itself. */\n mode: StudioMode;\n /** The Studio apps shown in the app bar, in order. */\n apps: AppOptions[];\n /** Kept for callers that read `contributions.apps`; same list as `apps`. */\n contributions: {\n apps: AppOptions[];\n };\n currentProjectId?: string;\n /** The project named by the `:projectId` route param, once its schema has loaded. */\n currentProject?: ProjectUiConfig;\n currentProjectSchema: Entity[];\n /** Projects whose schema loaded, in `projectIds` order. */\n projects: ProjectUiConfig[];\n /** Every project id the Studio can open, loaded or not. */\n projectIds: string[];\n /** Hosted mode: name, avatar, role and team of each project, known before any schema loads. */\n projectSummaries: ProjectSummary[];\n /** Per project id: why its schema could not be loaded. */\n schemaErrors: { [projectId: string]: ProjectSchemaError };\n isLoadingSchemas: boolean;\n}\n\nconst ConfigContext = createContext<ConfigContext>({\n mode: 'projects',\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId: undefined,\n currentProject: undefined,\n currentProjectSchema: [],\n projects: [],\n projectIds: [],\n projectSummaries: [],\n schemaErrors: {},\n isLoadingSchemas: false,\n});\n\n/** Appends the reserved asset and tag entities to a deployed schema. */\nexport function upsertReservedEntities(schema: Entity[]): Entity[] {\n const withoutReserved = schema.filter((entity) => entity.name !== assetSchema.name && entity.name !== tagSchema.name);\n\n return [...withoutReserved, assetSchema, tagSchema];\n}\n\nexport function ConfigProvider({\n projectIds,\n projectSummaries = [],\n mode = 'projects',\n userId,\n children,\n}: {\n projectIds: string[];\n projectSummaries?: ProjectSummary[];\n mode?: StudioMode;\n /** Hosted mode: the signed-in user's id, known before the per-project `/users/me` call. */\n userId?: string;\n children: React.ReactNode;\n}): JSX.Element {\n /**\n * Getting the projectId from the URL via react-router-dom's useParams hook triggers a rerender of this Context\n * every time the URL changes.\n */\n const { projectId: currentProjectId } = useParams<{ projectId: string }>();\n const [, auth] = useAuth();\n const schemaUserId = auth.user?.id ?? userId;\n // Project mode loads every project up front (short, host-defined list); hosted mode only the one open.\n const allSchemas = useProjectSchemas(mode === 'projects' ? projectIds : [], schemaUserId);\n const currentSchema = useProjectSchema(\n mode === 'hosted' && currentProjectId && projectIds.includes(currentProjectId) ? currentProjectId : undefined,\n schemaUserId\n );\n const { projects: loadedProjects, errors, isLoading } = mode === 'hosted' ? currentSchema : allSchemas;\n const projects = useMemo(\n () =>\n projectIds\n .map((projectId) => loadedProjects.find((project) => project.projectId === projectId))\n .filter((project): project is ProjectUiConfig => project !== undefined)\n .map((project) => ({ ...project, schema: upsertReservedEntities(project.schema) })),\n [loadedProjects, projectIds]\n );\n\n const value = useMemo<ConfigContext>(() => {\n const currentProject = projects.find((project) => project.projectId === currentProjectId);\n\n return {\n mode,\n apps: builtInApps,\n contributions: { apps: builtInApps },\n currentProjectId,\n currentProject,\n currentProjectSchema: currentProject?.schema ?? [],\n projects,\n projectIds,\n projectSummaries,\n schemaErrors: errors,\n isLoadingSchemas: isLoading,\n };\n }, [currentProjectId, errors, isLoading, mode, projectIds, projectSummaries, projects]);\n\n return <ConfigContext.Provider value={value}>{children}</ConfigContext.Provider>;\n}\n\nexport function useConfig(): ConfigContext {\n return useContext(ConfigContext);\n}\n"]}
package/dist/index.d.ts CHANGED
@@ -476,6 +476,8 @@ interface AgentChatsList {
476
476
  hasMore: boolean;
477
477
  }
478
478
  interface AgentChatDetail {
479
+ hasMore?: boolean;
480
+ nextCursor?: string | null;
479
481
  chat: AgentChat;
480
482
  messages: AgentChatMessage[];
481
483
  pendingApproval: AutomationApproval | null;