@flexkit/studio 0.2.30 → 0.2.31

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 (65) hide show
  1. package/dist/{chat-page-5HRMQQRO.js → chat-page-JS5SJ4OG.js} +3 -3
  2. package/dist/{chat-page-5HRMQQRO.js.map → chat-page-JS5SJ4OG.js.map} +1 -1
  3. package/dist/{chunk-5D6JCGLZ.js → chunk-57X5WRMY.js} +2 -2
  4. package/dist/{chunk-5D6JCGLZ.js.map → chunk-57X5WRMY.js.map} +1 -1
  5. package/dist/{chunk-WPNV6WNQ.js → chunk-5NQ47SWN.js} +3 -3
  6. package/dist/{chunk-WPNV6WNQ.js.map → chunk-5NQ47SWN.js.map} +1 -1
  7. package/dist/{chunk-MNFVAW2B.js → chunk-6GXNHR6H.js} +2 -2
  8. package/dist/{chunk-MNFVAW2B.js.map → chunk-6GXNHR6H.js.map} +1 -1
  9. package/dist/{chunk-BQWW2Q6B.js → chunk-D76P4TER.js} +3 -3
  10. package/dist/{chunk-BQWW2Q6B.js.map → chunk-D76P4TER.js.map} +1 -1
  11. package/dist/{chunk-A6UGAPMZ.js → chunk-GQTWNWT7.js} +2 -2
  12. package/dist/{chunk-A6UGAPMZ.js.map → chunk-GQTWNWT7.js.map} +1 -1
  13. package/dist/{chunk-LBFL34FM.js → chunk-GXQSNOGM.js} +3 -3
  14. package/dist/{chunk-LBFL34FM.js.map → chunk-GXQSNOGM.js.map} +1 -1
  15. package/dist/{chunk-K2VO74FW.js → chunk-KVYQ3O4F.js} +3 -3
  16. package/dist/{chunk-K2VO74FW.js.map → chunk-KVYQ3O4F.js.map} +1 -1
  17. package/dist/{chunk-WJRC5CQQ.js → chunk-LF4B2TQI.js} +4 -4
  18. package/dist/{chunk-WJRC5CQQ.js.map → chunk-LF4B2TQI.js.map} +1 -1
  19. package/dist/{chunk-E4RN4USU.js → chunk-OMYDXVWS.js} +3 -3
  20. package/dist/{chunk-E4RN4USU.js.map → chunk-OMYDXVWS.js.map} +1 -1
  21. package/dist/{chunk-EC3SJ4NQ.js → chunk-SZ3DX7XD.js} +2 -2
  22. package/dist/{chunk-EC3SJ4NQ.js.map → chunk-SZ3DX7XD.js.map} +1 -1
  23. package/dist/{chunk-CR3UGX4V.js → chunk-T4SEZXGL.js} +2 -2
  24. package/dist/{chunk-CR3UGX4V.js.map → chunk-T4SEZXGL.js.map} +1 -1
  25. package/dist/{chunk-6X54ZCSO.js → chunk-W74OKBZG.js} +2 -2
  26. package/dist/{chunk-6X54ZCSO.js.map → chunk-W74OKBZG.js.map} +1 -1
  27. package/dist/chunk-XLFAJBPN.js +3 -0
  28. package/dist/chunk-XLFAJBPN.js.map +1 -0
  29. package/dist/{entry-FXAA2IGV.js → entry-PFXS633U.js} +2 -2
  30. package/dist/{entry-FXAA2IGV.js.map → entry-PFXS633U.js.map} +1 -1
  31. package/dist/index.js +2 -2
  32. package/dist/{list-TLIH4DCX.js → list-EWWRLK4I.js} +3 -3
  33. package/dist/{list-TLIH4DCX.js.map → list-EWWRLK4I.js.map} +1 -1
  34. package/dist/list-R7SJFXCX.js +2 -0
  35. package/dist/list-R7SJFXCX.js.map +1 -0
  36. package/dist/{pages-IXHYEUBL.js → pages-UKJWXOMO.js} +3 -3
  37. package/dist/{pages-IXHYEUBL.js.map → pages-UKJWXOMO.js.map} +1 -1
  38. package/dist/{plugin-pages-Q5KRARJD.js → plugin-pages-X3V2VPAU.js} +2 -2
  39. package/dist/{plugin-pages-Q5KRARJD.js.map → plugin-pages-X3V2VPAU.js.map} +1 -1
  40. package/dist/record-links-VH2TPCK4.js +2 -0
  41. package/dist/{record-links-DSRYOOM5.js.map → record-links-VH2TPCK4.js.map} +1 -1
  42. package/dist/{root-NW5QG7W5.js → root-4QRY7KAC.js} +3 -3
  43. package/dist/{root-NW5QG7W5.js.map → root-4QRY7KAC.js.map} +1 -1
  44. package/dist/{root-2QWOQ2AH.js → root-7YXE6DEA.js} +3 -3
  45. package/dist/{root-2QWOQ2AH.js.map → root-7YXE6DEA.js.map} +1 -1
  46. package/dist/{root-IMTXHNCZ.js → root-FNXHGVQT.js} +2 -2
  47. package/dist/{root-IMTXHNCZ.js.map → root-FNXHGVQT.js.map} +1 -1
  48. package/dist/{root-IJKEEUBR.js → root-HQQ4TNTR.js} +2 -2
  49. package/dist/{root-IJKEEUBR.js.map → root-HQQ4TNTR.js.map} +1 -1
  50. package/dist/{root-TERO3GWT.js → root-NYAXP66A.js} +3 -3
  51. package/dist/{root-TERO3GWT.js.map → root-NYAXP66A.js.map} +1 -1
  52. package/dist/{root-IKO3UPTJ.js → root-OJ4UFMRX.js} +2 -2
  53. package/dist/{root-IKO3UPTJ.js.map → root-OJ4UFMRX.js.map} +1 -1
  54. package/dist/{search-THZV66M5.js → search-LSIHN6OI.js} +2 -2
  55. package/dist/{search-THZV66M5.js.map → search-LSIHN6OI.js.map} +1 -1
  56. package/dist/{skills-pages-D2QSG6WT.js → skills-pages-W47HECK3.js} +2 -2
  57. package/dist/{skills-pages-D2QSG6WT.js.map → skills-pages-W47HECK3.js.map} +1 -1
  58. package/dist/{source-AH4O5WGE.js → source-3N7BQVYO.js} +2 -2
  59. package/dist/{source-AH4O5WGE.js.map → source-3N7BQVYO.js.map} +1 -1
  60. package/package.json +1 -1
  61. package/dist/chunk-4TQ25SVS.js +0 -3
  62. package/dist/chunk-4TQ25SVS.js.map +0 -1
  63. package/dist/list-DWSTP7CW.js +0 -2
  64. package/dist/list-DWSTP7CW.js.map +0 -1
  65. package/dist/record-links-DSRYOOM5.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/knowledge/source.tsx"],"names":["DETAIL_POLL_INTERVAL_MS","SourcePageHeader","actions","title","jsxs","Fragment","Tooltip","jsx","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","Button","Link","ArrowLeft","SourceDetailSkeleton","Skeleton","SectionTitle","children","PassageList","projectId","source","version","passageCount","versionId","getPassagesKey","pageIndex","KNOWLEDGE_PASSAGES_PAGE_SIZE","from","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","passages","page","loaded","useEffect","passage","where","formatKnowledgeLocator","LoaderCircle","SourceSettings","api","onSaved","canMutate","useCanMutate","auth","useAuth","spacesData","useSWR","userSpaceCodes","projectSpaces","selectableSpaces","space","foreignSpaces","code","setTitle","useState","isSaving","setIsSaving","titleChanged","save","patch","result","invalidateKnowledgeLists","toast","describeApiError","disabled","spacesEmptyMessage","Alert","AlertDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","event","Switch","checked","Checkbox","toggleSpaceCode","Source","useProjectKnowledge","sourceId","useParams","navigate","useNavigate","isViewing","useIsViewing","isBusy","setIsBusy","isReindexing","setIsReindexing","data","mutate","isKnowledgeSourceBusy","PageMessage","job","status","summarizeKnowledgeStatus","isWorking","reindex","reindexError","facts","getKnowledgeKindLabel","ExternalLinkIcon","formatFileSize","formatDistance","PermissionTooltip","RefreshCwIcon","SourceActionsMenu","SourceIcon","StatusBadge","fact","warning","formatKnowledgeWarning","saved","LinkedRecordsSection","BookOpenIcon"],"mappings":"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","file":"source-AH4O5WGE.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useState } from 'react';\nimport { formatDistance } from 'date-fns';\nimport { ArrowLeft, BookOpenIcon, ExternalLinkIcon, LoaderCircle, RefreshCwIcon } from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAuth } from '../../auth/auth-context';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n Switch,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, knowledgePaths, type KnowledgeApi, type ProjectSpace } from './api';\nimport {\n formatFileSize,\n formatKnowledgeLocator,\n formatKnowledgeWarning,\n getKnowledgeKindLabel,\n isKnowledgeSourceBusy,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n KNOWLEDGE_PASSAGES_PAGE_SIZE,\n summarizeKnowledgeStatus,\n toggleSpaceCode,\n type KnowledgePassage,\n type KnowledgePassagesPage,\n type KnowledgeSource,\n type KnowledgeSourceDetail,\n} from './knowledge';\nimport { LinkedRecordsSection } from './record-links';\nimport {\n describeApiError,\n invalidateKnowledgeLists,\n PageMessage,\n SourceActionsMenu,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst DETAIL_POLL_INTERVAL_MS = 2_000;\n\nfunction SourcePageHeader({ actions, title }: { actions?: JSX.Element; title: string }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:w-fit fk:shrink-0\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n All documents\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SourceDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6\">\n <span className=\"fk:sr-only\">Loading document</span>\n <Skeleton className=\"fk:h-6 fk:w-64\" />\n <Skeleton className=\"fk:h-4 fk:w-96\" />\n <Skeleton className=\"fk:h-32 fk:w-full\" />\n </div>\n );\n}\n\nfunction SectionTitle({ children }: { children: string }): JSX.Element {\n return <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">{children}</h3>;\n}\n\nfunction PassageList({ projectId, source }: { projectId: string; source: KnowledgeSource }): JSX.Element {\n const version = source.currentVersion?.status === 'published' ? source.currentVersion : null;\n const passageCount = version?.passageCount ?? 0;\n const versionId = version?.id ?? null;\n const getPassagesKey = (pageIndex: number): string | null => {\n if (!versionId || pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE >= passageCount) {\n return null;\n }\n\n const from = pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE;\n const path = knowledgePaths(projectId).passages(source.id, {\n from,\n to: Math.min(from + KNOWLEDGE_PASSAGES_PAGE_SIZE - 1, passageCount - 1),\n });\n\n // The version is part of the key, so a re-index swaps the pages instead\n // of serving the retired ones; the server ignores the extra parameter.\n return `${path}&version=${encodeURIComponent(versionId)}`;\n };\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgePassagesPage>(getPassagesKey, fetcher, {\n revalidateFirstPage: false,\n });\n const passages: KnowledgePassage[] = pages?.flatMap((page) => page.passages) ?? [];\n const loaded = passages.length;\n\n // A new version starts from its first page again.\n useEffect(() => {\n void setSize(1);\n }, [setSize, versionId]);\n\n if (passageCount === 0) {\n return <p className=\"fk:text-sm fk:text-muted-foreground\">Passages appear here once the document is indexed.</p>;\n }\n\n if (error) {\n return <p className=\"fk:text-sm fk:text-destructive\">The passages could not be loaded.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\">\n {passages.map((passage) => {\n const where = formatKnowledgeLocator(passage.locator);\n\n return (\n <article\n className=\"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle\"\n key={passage.id}\n >\n <header className=\"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <span className=\"fk:font-medium\">#{String(passage.order + 1)}</span>\n {where ? <span className=\"fk:truncate\">{where}</span> : null}\n </header>\n <p className=\"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed\">{passage.text}</p>\n </article>\n );\n })}\n {isLoading ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Loading passages…\n </div>\n ) : null}\n {loaded < passageCount && !isLoading ? (\n <Button className=\"fk:w-fit\" size=\"sm\" variant=\"outline\" onClick={() => void setSize(size + 1)}>\n Show more ({String(loaded)} of {String(passageCount)})\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction SourceSettings({\n api,\n onSaved,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n onSaved: (_source: KnowledgeSource) => void;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [, auth] = useAuth();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(knowledgePaths(projectId).spaces, fetcher);\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only the caller's own spaces are offered: changing a source needs every\n // space it is shared with, and the server refuses codes the caller lacks.\n const projectSpaces = spacesData?.spaces ?? [];\n const selectableSpaces = projectSpaces.filter((space) => userSpaceCodes.includes(space.code));\n const foreignSpaces = source.spaces.filter((code) => !userSpaceCodes.includes(code));\n const [title, setTitle] = useState(source.title);\n const [isSaving, setIsSaving] = useState(false);\n const titleChanged = title.trim() !== source.title && title.trim().length > 0;\n\n useEffect(() => {\n setTitle(source.title);\n }, [source.title]);\n\n async function save(patch: { agentVisible?: boolean; spaces?: string[]; title?: string }): Promise<void> {\n if (!canMutate) {\n return;\n }\n\n setIsSaving(true);\n\n try {\n const result = await api.updateSource(source.id, patch);\n\n onSaved(result.source);\n void invalidateKnowledgeLists();\n } catch (error) {\n toast.error(describeApiError(error, 'The document could not be updated.'));\n } finally {\n setIsSaving(false);\n }\n }\n\n const disabled = !canMutate || isSaving || foreignSpaces.length > 0;\n let spacesEmptyMessage = 'This project has no spaces yet, so every member can read it.';\n\n if (projectSpaces.length > 0) {\n spacesEmptyMessage = 'You are not a member of any space in this project.';\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-5\">\n {foreignSpaces.length > 0 ? (\n <Alert>\n <AlertDescription>\n This document is shared with spaces you are not a member of ({foreignSpaces.join(', ')}), so only an owner\n or a member of all of them can change it.\n </AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-title\">Title</Label>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Input\n className=\"fk:max-w-md\"\n disabled={disabled}\n id=\"knowledge-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && titleChanged) {\n event.preventDefault();\n void save({ title: title.trim() });\n }\n }}\n />\n {titleChanged ? (\n <Button disabled={disabled} size=\"sm\" variant=\"outline\" onClick={() => void save({ title: title.trim() })}>\n Save\n </Button>\n ) : null}\n </div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">The agent cites the document by this title.</p>\n </div>\n <label className=\"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3\">\n <Switch\n checked={source.agentVisible}\n disabled={disabled}\n onCheckedChange={(checked) => void save({ agentVisible: checked })}\n />\n <span className=\"fk:flex fk:flex-col\">\n <span className=\"fk:text-sm fk:font-medium\">Visible to the agent</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Off keeps the document in the list for people but out of the agent's searches.\n </span>\n </span>\n </label>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <span className=\"fk:text-sm fk:font-medium\">Spaces</span>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {source.spaces.length === 0\n ? 'Every project member can read this document. Pick spaces to limit it to their members.'\n : 'Only members of the selected spaces (and the agent working for them) can read this document.'}\n </p>\n {selectableSpaces.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{spacesEmptyMessage}</p>\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2\">\n {selectableSpaces.map((space) => (\n <label className=\"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm\" key={space.id}>\n <Checkbox\n checked={source.spaces.includes(space.code)}\n disabled={disabled}\n onCheckedChange={() => void save({ spaces: toggleSpaceCode(source.spaces, space.code) })}\n />\n {space.label}\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Source(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const { sourceId } = useParams<{ sourceId: string }>();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const [isBusy, setIsBusy] = useState(false);\n const [isReindexing, setIsReindexing] = useState(false);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeSourceDetail>(\n projectId && sourceId ? knowledgePaths(projectId).source(sourceId) : null,\n fetcher,\n { refreshInterval: isViewing && isBusy ? DETAIL_POLL_INTERVAL_MS : 0 }\n );\n\n useEffect(() => {\n setIsBusy(data ? isKnowledgeSourceBusy(data.source, data.job) : false);\n }, [data]);\n\n if (!projectId || !api || !sourceId) {\n return <PageMessage>Select a document.</PageMessage>;\n }\n\n // A failed background refresh keeps the last good data on screen; only a\n // document that never loaded is reported as missing.\n if (error && !data) {\n return <PageMessage>This document does not exist or is not shared with you.</PageMessage>;\n }\n\n if (isLoading || !data) {\n return <SourceDetailSkeleton />;\n }\n\n const { job, source } = data;\n const status = summarizeKnowledgeStatus(source, job);\n const version = source.currentVersion;\n const isWorking = isReindexing;\n\n async function reindex(): Promise<void> {\n setIsReindexing(true);\n\n try {\n const result = await api!.reingestSource(source.id);\n\n toast.success('Re-indexing started.');\n await mutate({ job: result.job, source: { ...source, status: 'processing' } }, { revalidate: true });\n } catch (reindexError) {\n toast.error(describeApiError(reindexError, 'The document could not be re-indexed.'));\n } finally {\n setIsReindexing(false);\n }\n }\n\n const facts: { label: string; value: JSX.Element | string }[] = [\n { label: 'Type', value: getKnowledgeKindLabel(source) },\n ];\n\n if (source.originUrl) {\n facts.push({\n label: 'Address',\n value: (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2\"\n href={source.originUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span className=\"fk:truncate\">{source.originUrl}</span>\n <ExternalLinkIcon className=\"fk:size-3.5 fk:shrink-0\" />\n </a>\n ),\n });\n }\n\n if (source.size !== null) {\n facts.push({ label: 'Size', value: formatFileSize(source.size) });\n }\n\n facts.push({ label: 'Added', value: formatDistance(new Date(source.createdAt), new Date(), { addSuffix: true }) });\n\n if (version?.publishedAt) {\n facts.push({\n label: 'Indexed',\n value: formatDistance(new Date(version.publishedAt), new Date(), { addSuffix: true }),\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SourcePageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <PermissionTooltip disabled={!canMutate}>\n <Button\n disabled={!canMutate || isWorking || status.tone === 'busy'}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void reindex()}\n >\n {isReindexing ? <LoaderCircle className=\"fk:animate-spin\" /> : <RefreshCwIcon />}\n Re-index\n </Button>\n </PermissionTooltip>\n <SourceActionsMenu\n isBusy={isWorking}\n source={source}\n trigger=\"page\"\n onRemoved={() => navigate('..', { relative: 'path' })}\n />\n </div>\n }\n title={source.title}\n />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6\">\n <section className=\"fk:flex fk:items-start fk:gap-4\">\n <SourceIcon source={source} />\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:text-sm fk:text-muted-foreground\">{status.detail}</span>\n </div>\n {job?.error?.hint && (status.tone === 'error' || job.state === 'failed') ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{job.error.hint}</p>\n ) : null}\n <dl className=\"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm\">\n {facts.map((fact) => (\n <div className=\"fk:contents\" key={fact.label}>\n <dt className=\"fk:text-muted-foreground\">{fact.label}</dt>\n <dd className=\"fk:min-w-0 fk:truncate\">{fact.value}</dd>\n </div>\n ))}\n </dl>\n {version && version.warnings.length > 0 ? (\n <Alert>\n <AlertDescription>\n <ul className=\"fk:list-disc fk:pl-4\">\n {version.warnings.map((warning) => (\n <li key={warning}>{formatKnowledgeWarning(warning)}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n </div>\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <SectionTitle>Settings</SectionTitle>\n <SourceSettings\n api={api}\n projectId={projectId}\n source={source}\n onSaved={(saved) => void mutate({ job, source: saved }, { revalidate: false })}\n />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <LinkedRecordsSection api={api} projectId={projectId} source={source} />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <SectionTitle>Passages</SectionTitle>\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n The document is split into passages the agent searches and cites. Each one keeps its page, slide or\n section so a citation points back to the right place.\n </p>\n <PassageList projectId={projectId} source={source} />\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/apps/knowledge/source.tsx"],"names":["DETAIL_POLL_INTERVAL_MS","SourcePageHeader","actions","title","jsxs","Fragment","Tooltip","jsx","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","Button","Link","ArrowLeft","SourceDetailSkeleton","Skeleton","SectionTitle","children","PassageList","projectId","source","version","passageCount","versionId","getPassagesKey","pageIndex","KNOWLEDGE_PASSAGES_PAGE_SIZE","from","knowledgePaths","pages","error","isLoading","setSize","size","useSWRInfinite","fetcher","passages","page","loaded","useEffect","passage","where","formatKnowledgeLocator","LoaderCircle","SourceSettings","api","onSaved","canMutate","useCanMutate","auth","useAuth","spacesData","useSWR","userSpaceCodes","projectSpaces","selectableSpaces","space","foreignSpaces","code","setTitle","useState","isSaving","setIsSaving","titleChanged","save","patch","result","invalidateKnowledgeLists","toast","describeApiError","disabled","spacesEmptyMessage","Alert","AlertDescription","Label","Input","KNOWLEDGE_MAX_TITLE_LENGTH","event","Switch","checked","Checkbox","toggleSpaceCode","Source","useProjectKnowledge","sourceId","useParams","navigate","useNavigate","isViewing","useIsViewing","isBusy","setIsBusy","isReindexing","setIsReindexing","data","mutate","isKnowledgeSourceBusy","PageMessage","job","status","summarizeKnowledgeStatus","isWorking","reindex","reindexError","facts","getKnowledgeKindLabel","ExternalLinkIcon","formatFileSize","formatDistance","PermissionTooltip","RefreshCwIcon","SourceActionsMenu","SourceIcon","StatusBadge","fact","warning","formatKnowledgeWarning","saved","LinkedRecordsSection","BookOpenIcon"],"mappings":"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","file":"source-3N7BQVYO.js","sourcesContent":["import type { JSX } from 'react';\nimport { useEffect, useState } from 'react';\nimport { formatDistance } from 'date-fns';\nimport { ArrowLeft, BookOpenIcon, ExternalLinkIcon, LoaderCircle, RefreshCwIcon } from 'lucide-react';\nimport { Link, useNavigate, useParams } from 'react-router-dom';\nimport useSWR from 'swr';\nimport useSWRInfinite from 'swr/infinite';\nimport { useAuth } from '../../auth/auth-context';\nimport { useIsViewing } from '../../core/apps/app-active';\nimport { useCanMutate } from '../../core/permissions';\nimport {\n Alert,\n AlertDescription,\n Button,\n Checkbox,\n Input,\n Label,\n PermissionTooltip,\n Separator,\n SidebarTrigger,\n Skeleton,\n Switch,\n toast,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '../../ui';\nimport { fetcher, knowledgePaths, type KnowledgeApi, type ProjectSpace } from './api';\nimport {\n formatFileSize,\n formatKnowledgeLocator,\n formatKnowledgeWarning,\n getKnowledgeKindLabel,\n isKnowledgeSourceBusy,\n KNOWLEDGE_MAX_TITLE_LENGTH,\n KNOWLEDGE_PASSAGES_PAGE_SIZE,\n summarizeKnowledgeStatus,\n toggleSpaceCode,\n type KnowledgePassage,\n type KnowledgePassagesPage,\n type KnowledgeSource,\n type KnowledgeSourceDetail,\n} from './knowledge';\nimport { LinkedRecordsSection } from './record-links';\nimport {\n describeApiError,\n invalidateKnowledgeLists,\n PageMessage,\n SourceActionsMenu,\n SourceIcon,\n StatusBadge,\n useProjectKnowledge,\n} from './shared';\n\nconst DETAIL_POLL_INTERVAL_MS = 2_000;\n\nfunction SourcePageHeader({ actions, title }: { actions?: JSX.Element; title: string }): JSX.Element {\n return (\n <>\n <div className=\"fk:flex fk:shrink-0 fk:items-center fk:gap-2 fk:pr-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:h-4 fk:w-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h1 className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {title}\n </h1>\n {actions}\n </div>\n <Button asChild className=\"fk:w-fit fk:shrink-0\" size=\"sm\" variant=\"ghost\">\n <Link relative=\"path\" to=\"..\">\n <ArrowLeft className=\"fk:mr-2 fk:size-4\" />\n All documents\n </Link>\n </Button>\n </>\n );\n}\n\nfunction SourceDetailSkeleton(): JSX.Element {\n return (\n <div aria-busy=\"true\" className=\"fk:flex fk:flex-col fk:gap-6 fk:py-6 fk:pl-4 fk:pr-6\">\n <span className=\"fk:sr-only\">Loading document</span>\n <Skeleton className=\"fk:h-6 fk:w-64\" />\n <Skeleton className=\"fk:h-4 fk:w-96\" />\n <Skeleton className=\"fk:h-32 fk:w-full\" />\n </div>\n );\n}\n\nfunction SectionTitle({ children }: { children: string }): JSX.Element {\n return <h3 className=\"fk:text-sm fk:font-semibold fk:tracking-tight\">{children}</h3>;\n}\n\nfunction PassageList({ projectId, source }: { projectId: string; source: KnowledgeSource }): JSX.Element {\n const version = source.currentVersion?.status === 'published' ? source.currentVersion : null;\n const passageCount = version?.passageCount ?? 0;\n const versionId = version?.id ?? null;\n const getPassagesKey = (pageIndex: number): string | null => {\n if (!versionId || pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE >= passageCount) {\n return null;\n }\n\n const from = pageIndex * KNOWLEDGE_PASSAGES_PAGE_SIZE;\n const path = knowledgePaths(projectId).passages(source.id, {\n from,\n to: Math.min(from + KNOWLEDGE_PASSAGES_PAGE_SIZE - 1, passageCount - 1),\n });\n\n // The version is part of the key, so a re-index swaps the pages instead\n // of serving the retired ones; the server ignores the extra parameter.\n return `${path}&version=${encodeURIComponent(versionId)}`;\n };\n const {\n data: pages,\n error,\n isLoading,\n setSize,\n size,\n } = useSWRInfinite<KnowledgePassagesPage>(getPassagesKey, fetcher, {\n revalidateFirstPage: false,\n });\n const passages: KnowledgePassage[] = pages?.flatMap((page) => page.passages) ?? [];\n const loaded = passages.length;\n\n // A new version starts from its first page again.\n useEffect(() => {\n void setSize(1);\n }, [setSize, versionId]);\n\n if (passageCount === 0) {\n return <p className=\"fk:text-sm fk:text-muted-foreground\">Passages appear here once the document is indexed.</p>;\n }\n\n if (error) {\n return <p className=\"fk:text-sm fk:text-destructive\">The passages could not be loaded.</p>;\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-3\">\n {passages.map((passage) => {\n const where = formatKnowledgeLocator(passage.locator);\n\n return (\n <article\n className=\"fk:rounded-lg fk:border fk:bg-background fk:px-4 fk:py-3 fk:corner-squircle\"\n key={passage.id}\n >\n <header className=\"fk:mb-1.5 fk:flex fk:items-center fk:gap-2 fk:text-xs fk:text-muted-foreground\">\n <span className=\"fk:font-medium\">#{String(passage.order + 1)}</span>\n {where ? <span className=\"fk:truncate\">{where}</span> : null}\n </header>\n <p className=\"fk:whitespace-pre-wrap fk:text-sm fk:leading-relaxed\">{passage.text}</p>\n </article>\n );\n })}\n {isLoading ? (\n <div className=\"fk:flex fk:items-center fk:gap-2 fk:py-2 fk:text-sm fk:text-muted-foreground\">\n <LoaderCircle className=\"fk:size-4 fk:animate-spin\" />\n Loading passages…\n </div>\n ) : null}\n {loaded < passageCount && !isLoading ? (\n <Button className=\"fk:w-fit\" size=\"sm\" variant=\"outline\" onClick={() => void setSize(size + 1)}>\n Show more ({String(loaded)} of {String(passageCount)})\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction SourceSettings({\n api,\n onSaved,\n projectId,\n source,\n}: {\n api: KnowledgeApi;\n onSaved: (_source: KnowledgeSource) => void;\n projectId: string;\n source: KnowledgeSource;\n}): JSX.Element {\n const canMutate = useCanMutate();\n const [, auth] = useAuth();\n const { data: spacesData } = useSWR<{ spaces: ProjectSpace[] }>(knowledgePaths(projectId).spaces, fetcher);\n const userSpaceCodes = auth.user?.spaces ?? [];\n // Only the caller's own spaces are offered: changing a source needs every\n // space it is shared with, and the server refuses codes the caller lacks.\n const projectSpaces = spacesData?.spaces ?? [];\n const selectableSpaces = projectSpaces.filter((space) => userSpaceCodes.includes(space.code));\n const foreignSpaces = source.spaces.filter((code) => !userSpaceCodes.includes(code));\n const [title, setTitle] = useState(source.title);\n const [isSaving, setIsSaving] = useState(false);\n const titleChanged = title.trim() !== source.title && title.trim().length > 0;\n\n useEffect(() => {\n setTitle(source.title);\n }, [source.title]);\n\n async function save(patch: { agentVisible?: boolean; spaces?: string[]; title?: string }): Promise<void> {\n if (!canMutate) {\n return;\n }\n\n setIsSaving(true);\n\n try {\n const result = await api.updateSource(source.id, patch);\n\n onSaved(result.source);\n void invalidateKnowledgeLists();\n } catch (error) {\n toast.error(describeApiError(error, 'The document could not be updated.'));\n } finally {\n setIsSaving(false);\n }\n }\n\n const disabled = !canMutate || isSaving || foreignSpaces.length > 0;\n let spacesEmptyMessage = 'This project has no spaces yet, so every member can read it.';\n\n if (projectSpaces.length > 0) {\n spacesEmptyMessage = 'You are not a member of any space in this project.';\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:gap-5\">\n {foreignSpaces.length > 0 ? (\n <Alert>\n <AlertDescription>\n This document is shared with spaces you are not a member of ({foreignSpaces.join(', ')}), so only an owner\n or a member of all of them can change it.\n </AlertDescription>\n </Alert>\n ) : null}\n <div className=\"fk:flex fk:flex-col fk:gap-1.5\">\n <Label htmlFor=\"knowledge-title\">Title</Label>\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <Input\n className=\"fk:max-w-md\"\n disabled={disabled}\n id=\"knowledge-title\"\n maxLength={KNOWLEDGE_MAX_TITLE_LENGTH}\n value={title}\n onChange={(event) => setTitle(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && titleChanged) {\n event.preventDefault();\n void save({ title: title.trim() });\n }\n }}\n />\n {titleChanged ? (\n <Button disabled={disabled} size=\"sm\" variant=\"outline\" onClick={() => void save({ title: title.trim() })}>\n Save\n </Button>\n ) : null}\n </div>\n <p className=\"fk:text-xs fk:text-muted-foreground\">The agent cites the document by this title.</p>\n </div>\n <label className=\"fk:flex fk:w-fit fk:cursor-pointer fk:items-center fk:gap-3\">\n <Switch\n checked={source.agentVisible}\n disabled={disabled}\n onCheckedChange={(checked) => void save({ agentVisible: checked })}\n />\n <span className=\"fk:flex fk:flex-col\">\n <span className=\"fk:text-sm fk:font-medium\">Visible to the agent</span>\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n Off keeps the document in the list for people but out of the agent's searches.\n </span>\n </span>\n </label>\n <div className=\"fk:flex fk:flex-col fk:gap-2\">\n <span className=\"fk:text-sm fk:font-medium\">Spaces</span>\n <p className=\"fk:text-xs fk:text-muted-foreground\">\n {source.spaces.length === 0\n ? 'Every project member can read this document. Pick spaces to limit it to their members.'\n : 'Only members of the selected spaces (and the agent working for them) can read this document.'}\n </p>\n {selectableSpaces.length === 0 ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{spacesEmptyMessage}</p>\n ) : (\n <div className=\"fk:flex fk:flex-wrap fk:gap-x-6 fk:gap-y-2\">\n {selectableSpaces.map((space) => (\n <label className=\"fk:flex fk:cursor-pointer fk:items-center fk:gap-2 fk:text-sm\" key={space.id}>\n <Checkbox\n checked={source.spaces.includes(space.code)}\n disabled={disabled}\n onCheckedChange={() => void save({ spaces: toggleSpaceCode(source.spaces, space.code) })}\n />\n {space.label}\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function Source(): JSX.Element {\n const { api, projectId } = useProjectKnowledge();\n const { sourceId } = useParams<{ sourceId: string }>();\n const navigate = useNavigate();\n const canMutate = useCanMutate();\n const isViewing = useIsViewing();\n const [isBusy, setIsBusy] = useState(false);\n const [isReindexing, setIsReindexing] = useState(false);\n const { data, error, isLoading, mutate } = useSWR<KnowledgeSourceDetail>(\n projectId && sourceId ? knowledgePaths(projectId).source(sourceId) : null,\n fetcher,\n { refreshInterval: isViewing && isBusy ? DETAIL_POLL_INTERVAL_MS : 0 }\n );\n\n useEffect(() => {\n setIsBusy(data ? isKnowledgeSourceBusy(data.source, data.job) : false);\n }, [data]);\n\n if (!projectId || !api || !sourceId) {\n return <PageMessage>Select a document.</PageMessage>;\n }\n\n // A failed background refresh keeps the last good data on screen; only a\n // document that never loaded is reported as missing.\n if (error && !data) {\n return <PageMessage>This document does not exist or is not shared with you.</PageMessage>;\n }\n\n if (isLoading || !data) {\n return <SourceDetailSkeleton />;\n }\n\n const { job, source } = data;\n const status = summarizeKnowledgeStatus(source, job);\n const version = source.currentVersion;\n const isWorking = isReindexing;\n\n async function reindex(): Promise<void> {\n setIsReindexing(true);\n\n try {\n const result = await api!.reingestSource(source.id);\n\n toast.success('Re-indexing started.');\n await mutate({ job: result.job, source: { ...source, status: 'processing' } }, { revalidate: true });\n } catch (reindexError) {\n toast.error(describeApiError(reindexError, 'The document could not be re-indexed.'));\n } finally {\n setIsReindexing(false);\n }\n }\n\n const facts: { label: string; value: JSX.Element | string }[] = [\n { label: 'Type', value: getKnowledgeKindLabel(source) },\n ];\n\n if (source.originUrl) {\n facts.push({\n label: 'Address',\n value: (\n <a\n className=\"fk:inline-flex fk:items-center fk:gap-1 fk:underline fk:underline-offset-2\"\n href={source.originUrl}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n <span className=\"fk:truncate\">{source.originUrl}</span>\n <ExternalLinkIcon className=\"fk:size-3.5 fk:shrink-0\" />\n </a>\n ),\n });\n }\n\n if (source.size !== null) {\n facts.push({ label: 'Size', value: formatFileSize(source.size) });\n }\n\n facts.push({ label: 'Added', value: formatDistance(new Date(source.createdAt), new Date(), { addSuffix: true }) });\n\n if (version?.publishedAt) {\n facts.push({\n label: 'Indexed',\n value: formatDistance(new Date(version.publishedAt), new Date(), { addSuffix: true }),\n });\n }\n\n return (\n <div className=\"fk:flex fk:h-full fk:min-h-0 fk:min-w-0 fk:flex-col fk:gap-3 fk:pb-3\">\n <SourcePageHeader\n actions={\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <PermissionTooltip disabled={!canMutate}>\n <Button\n disabled={!canMutate || isWorking || status.tone === 'busy'}\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void reindex()}\n >\n {isReindexing ? <LoaderCircle className=\"fk:animate-spin\" /> : <RefreshCwIcon />}\n Re-index\n </Button>\n </PermissionTooltip>\n <SourceActionsMenu\n isBusy={isWorking}\n source={source}\n trigger=\"page\"\n onRemoved={() => navigate('..', { relative: 'path' })}\n />\n </div>\n }\n title={source.title}\n />\n <div className=\"fk:min-h-0 fk:flex-1 fk:overflow-auto\">\n <div className=\"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-2 fk:pl-4 fk:pr-6\">\n <section className=\"fk:flex fk:items-start fk:gap-4\">\n <SourceIcon source={source} />\n <div className=\"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-2\">\n <div className=\"fk:flex fk:flex-wrap fk:items-center fk:gap-2\">\n <StatusBadge label={status.label} tone={status.tone} />\n <span className=\"fk:text-sm fk:text-muted-foreground\">{status.detail}</span>\n </div>\n {job?.error?.hint && (status.tone === 'error' || job.state === 'failed') ? (\n <p className=\"fk:text-sm fk:text-muted-foreground\">{job.error.hint}</p>\n ) : null}\n <dl className=\"fk:grid fk:grid-cols-[auto_1fr] fk:gap-x-4 fk:gap-y-1 fk:text-sm\">\n {facts.map((fact) => (\n <div className=\"fk:contents\" key={fact.label}>\n <dt className=\"fk:text-muted-foreground\">{fact.label}</dt>\n <dd className=\"fk:min-w-0 fk:truncate\">{fact.value}</dd>\n </div>\n ))}\n </dl>\n {version && version.warnings.length > 0 ? (\n <Alert>\n <AlertDescription>\n <ul className=\"fk:list-disc fk:pl-4\">\n {version.warnings.map((warning) => (\n <li key={warning}>{formatKnowledgeWarning(warning)}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n </div>\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <SectionTitle>Settings</SectionTitle>\n <SourceSettings\n api={api}\n projectId={projectId}\n source={source}\n onSaved={(saved) => void mutate({ job, source: saved }, { revalidate: false })}\n />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <LinkedRecordsSection api={api} projectId={projectId} source={source} />\n </section>\n <Separator />\n <section className=\"fk:flex fk:flex-col fk:gap-4\">\n <div className=\"fk:flex fk:items-center fk:gap-2\">\n <BookOpenIcon className=\"fk:size-4 fk:text-muted-foreground\" />\n <SectionTitle>Passages</SectionTitle>\n </div>\n <p className=\"fk:text-sm fk:text-muted-foreground\">\n The document is split into passages the agent searches and cites. Each one keeps its page, slide or\n section so a citation points back to the right place.\n </p>\n <PassageList projectId={projectId} source={source} />\n </section>\n </div>\n </div>\n </div>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flexkit/studio",
3
- "version": "0.2.30",
3
+ "version": "0.2.31",
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",
@@ -1,3 +0,0 @@
1
- import'./index.css';import {g,d as d$1}from'./chunk-WPCPL2TQ.js';import {b as b$1}from'./chunk-U45E5X3H.js';import {createContext,lazy,Suspense,useMemo,useContext}from'react';import {Navigate,useParams}from'react-router-dom';import {Bot,Layout,FileStack,BookOpenText,Waypoints,SquarePlay}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';import w,{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 x(){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 o(e){let t=lazy(e);return jsx(Suspense,{fallback:jsx(x,{}),children:jsx(t,{})})}var J=o(()=>import('./root-IJKEEUBR.js').then(e=>({default:e.Root}))),X=o(()=>import('./list-DWSTP7CW.js').then(e=>({default:e.List}))),q=o(()=>import('./edit-entity-PVT34FD7.js').then(e=>({default:e.EditEntity}))),K=o(()=>import('./root-2QWOQ2AH.js').then(e=>({default:e.Root}))),G=o(()=>import('./root-IKO3UPTJ.js').then(e=>({default:e.Root}))),$=o(()=>import('./list-TLIH4DCX.js').then(e=>({default:e.List}))),Q=o(()=>import('./source-AH4O5WGE.js').then(e=>({default:e.Source}))),Y=o(()=>import('./root-NW5QG7W5.js').then(e=>({default:e.Root}))),ee=o(()=>import('./root-TERO3GWT.js').then(e=>({default:e.Root}))),te=o(()=>import('./root-IMTXHNCZ.js').then(e=>({default:e.Root}))),oe=o(()=>import('./plugin-pages-Q5KRARJD.js').then(e=>({default:e.PluginsPage}))),ne=o(()=>import('./plugin-pages-Q5KRARJD.js').then(e=>({default:e.InstalledPluginsPage}))),ae=o(()=>import('./plugin-pages-Q5KRARJD.js').then(e=>({default:e.PluginDetailPage}))),T=o(()=>import('./chat-page-5HRMQQRO.js').then(e=>({default:e.AgentChatPage}))),ie=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.AutomationsPage}))),re=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.RunHistoryPage}))),se=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.ApprovalsPage}))),pe=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.ActivityPage}))),ce=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.ActivityItemPage}))),le=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.CreateAutomationPage}))),me=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.AutomationDetailPage}))),ue=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.RunsPage}))),de=o(()=>import('./pages-IXHYEUBL.js').then(e=>({default:e.RunDetailPage}))),fe=o(()=>import('./skills-pages-D2QSG6WT.js').then(e=>({default:e.SkillsPage}))),ge=o(()=>import('./skills-pages-D2QSG6WT.js').then(e=>({default:e.CreateSkillPage}))),he=o(()=>import('./skills-pages-D2QSG6WT.js').then(e=>({default:e.SkillDetailPage}))),l=[{name:"ai",icon:jsx(Bot,{strokeWidth:1.5}),title:"AI",component:te,routes:[{path:"plugins",component:oe},{path:"plugins/installed",component:ne},{path:"plugins/:pluginId",component:ae},{component:jsx(_,{replace:true,to:"agent"}),path:""},{component:T,path:"agent"},{component:T,path:"agent/chats/:chatId"},{component:ie,path:"automations"},{component:re,path:"runs"},{component:se,path:"approvals"},{component:pe,path:"activity"},{component:ce,path:"activity/:itemId"},{component:le,path:"automations/new"},{component:me,path:"automations/:automationId"},{component:ue,path:"automations/:automationId/runs"},{component:de,path:"automations/:automationId/runs/:runId"},{component:fe,path:"skills"},{component:ge,path:"skills/new"},{component:he,path:"skills/:skillId"}]},{name:"desk",icon:jsx(Layout,{strokeWidth:1.5}),title:"Desk",component:J,routes:[{path:"list/:entity",component:X,children:[{path:"edit/:id",component:q}]}]},{name:"asset-manager",icon:jsx(FileStack,{strokeWidth:1.5}),title:"Asset Manager",component:K,routes:[]},{name:"knowledge",icon:jsx(BookOpenText,{strokeWidth:1.5}),title:"Knowledge",component:G,routes:[{component:$,path:""},{component:Q,path:":sourceId"}]},{name:"graph",icon:jsx(Waypoints,{strokeWidth:1.5}),title:"Graph",component:Y,routes:[]},{name:"explorer",icon:jsx(SquarePlay,{strokeWidth:1.5}),title:"Explorer",component:ee,routes:[]}];async function C(e){try{let t=await fetch(d$1(e).schema,{credentials:"include",mode:"cors"});if(!t.ok){let a=t.statusText||`Request failed with status ${String(t.status)}`;try{let i=await t.json();a=i.error??i.message??a;}catch{}return {ok:!1,projectId:e,error:{status:t.status,message:a}}}let n=await t.json();return {ok:!0,project:{...n,projectId:n.projectId||e}}}catch(t){return {ok:false,projectId:e,error:{status:0,message:t instanceof Error?t.message:"Network error"}}}}function b(e,t){let n=[],a={};for(let i of e??[])i.ok?n.push(i.project):a[i.projectId]=i.error;return {projects:n,errors:a,isLoading:t}}function L(e,t){let n=t&&e.length>0?["project-schemas",t,...e]:null,{data:a,isLoading:i}=w(n,()=>Promise.all(e.map(p=>C(p))),{revalidateOnFocus:false,revalidateOnReconnect:false});return b(a,!!n&&(i||a===void 0))}function Pe(e,t){return b(e?[e]:void 0,t)}function A(e,t){let n=t&&e?["project-schema",t,e]:null,{data:a,isLoading:i}=w(n,()=>C(e??""),{revalidateOnFocus:false,revalidateOnReconnect:false});return Pe(a,!!n&&(i||a===void 0))}function Se(e,t){return Array.isArray(e)&&(e[0]==="project-schema"||e[0]==="project-schemas")&&e.slice(2).includes(t)}function Fe(e){return mutate(t=>Se(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 xe(e){return [...e.filter(n=>n.name!==d.name&&n.name!==f.name),d,f]}function Xe({projectIds:e,projectSummaries:t=[],mode:n="projects",userId:a,children:i}){let{projectId:p}=useParams(),[,I]=g(),h=I.user?.id??a,V=L(n==="projects"?e:[],h),O=A(n==="hosted"&&p&&e.includes(p)?p:void 0,h),{projects:y,errors:P,isLoading:S}=n==="hosted"?O:V,m=useMemo(()=>e.map(s=>y.find(u=>u.projectId===s)).filter(s=>s!==void 0).map(s=>({...s,schema:xe(s.schema)})),[y,e]),H=useMemo(()=>{let s=m.find(u=>u.projectId===p);return {mode:n,apps:l,contributions:{apps:l},currentProjectId:p,currentProject:s,currentProjectSchema:s?.schema??[],projects:m,projectIds:e,projectSummaries:t,schemaErrors:P,isLoadingSchemas:S}},[p,P,S,n,e,t,m]);return jsx(R.Provider,{value:H,children:i})}function qe(){return useContext(R)}
2
- export{x as a,d as b,f as c,Fe as d,Xe as e,qe as f};//# sourceMappingURL=chunk-4TQ25SVS.js.map
3
- //# sourceMappingURL=chunk-4TQ25SVS.js.map
@@ -1 +0,0 @@
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","knowledgeRoot","knowledgeList","knowledgeSource","graphRoot","explorerRoot","aiRoot","aiPluginsPage","aiInstalledPluginsPage","aiPluginDetailPage","aiAgentChatPage","aiAutomationsPage","aiRunHistoryPage","aiApprovalsPage","aiActivityPage","aiActivityItemPage","aiCreateAutomationPage","aiAutomationDetailPage","aiRunsPage","aiRunDetailPage","aiSkillsPage","aiCreateSkillPage","aiSkillDetailPage","builtInApps","BotIcon","LayoutIcon","FileStackIcon","BookOpenTextIcon","WaypointsIcon","SquarePlayIcon","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-4TQ25SVS.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 BookOpenText as BookOpenTextIcon,\n Bot as BotIcon,\n FileStack as FileStackIcon,\n Layout as LayoutIcon,\n SquarePlay as SquarePlayIcon,\n Waypoints as WaypointsIcon,\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(() => import('../../apps/asset-manager/root').then((m) => ({ default: m.Root })));\n\n// Knowledge\nconst knowledgeRoot = lazyElement(() => import('../../apps/knowledge/root').then((m) => ({ default: m.Root })));\nconst knowledgeList = lazyElement(() => import('../../apps/knowledge/list').then((m) => ({ default: m.List })));\nconst knowledgeSource = lazyElement(() => import('../../apps/knowledge/source').then((m) => ({ default: m.Source })));\n\n// Graph\nconst graphRoot = lazyElement(() => import('../../apps/graph/root').then((m) => ({ default: m.Root })));\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(() => import('../../apps/ai/plugin-pages').then((m) => ({ default: m.PluginsPage })));\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(() => import('../../apps/ai/pages').then((m) => ({ default: m.RunHistoryPage })));\nconst aiApprovalsPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ApprovalsPage })));\nconst aiActivityPage = lazyElement(() => import('../../apps/ai/pages').then((m) => ({ default: m.ActivityPage })));\nconst aiActivityItemPage = lazyElement(() =>\n import('../../apps/ai/pages').then((m) => ({ default: m.ActivityItemPage }))\n);\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(() => import('../../apps/ai/skills-pages').then((m) => ({ default: m.SkillsPage })));\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: '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: aiActivityPage,\n path: 'activity',\n },\n {\n component: aiActivityItemPage,\n path: 'activity/:itemId',\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 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: 'knowledge',\n icon: <BookOpenTextIcon strokeWidth={1.5} />,\n title: 'Knowledge',\n component: knowledgeRoot,\n routes: [\n {\n component: knowledgeList,\n path: '',\n },\n {\n component: knowledgeSource,\n path: ':sourceId',\n },\n ],\n },\n {\n name: 'graph',\n icon: <WaypointsIcon strokeWidth={1.5} />,\n title: 'Graph',\n component: graphRoot,\n routes: [],\n },\n {\n name: 'explorer',\n icon: <SquarePlayIcon strokeWidth={1.5} />,\n title: 'Explorer',\n component: explorerRoot,\n routes: [],\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,2 +0,0 @@
1
- import'./index.css';import {c as c$2,a as a$1}from'./chunk-E4RN4USU.js';import {m as m$2,a,b,d as d$1}from'./chunk-WPNV6WNQ.js';import'./chunk-CAZ6EUR2.js';import'./chunk-2DXR5NJV.js';import {m as m$1,d,s}from'./chunk-BQWW2Q6B.js';import'./chunk-V7C4EHK3.js';import {e}from'./chunk-LBFL34FM.js';import {c}from'./chunk-XMOSCJOI.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import {f}from'./chunk-4TQ25SVS.js';import'./chunk-WPCPL2TQ.js';import'./chunk-5CVDMZUI.js';import {O}from'./chunk-DGIY4SKN.js';import {t}from'./chunk-SZEGGBOC.js';import {v}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b as b$1,c as c$1,e as e$1}from'./chunk-USNXQOMJ.js';import'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {useState,useMemo,useCallback}from'react';import {useParams,useLocation,Outlet}from'react-router-dom';import {jsx,jsxs}from'react/jsx-runtime';var m=36,ct=[{_updatedAt:"DESC"},{_id:"DESC"}];function vt(){let{entity:t}=useParams(),{search:a$1}=useLocation(),g=new URLSearchParams(a$1).get("id"),{scope:j}=c(),{schemaErrorMessage:G}=e(),{currentProject:Q}=f(),h=Q?.schema??[],n=m$1(h,t??""),[r,S]=useState([]),[W,B]=useState(0),[O$1,F]=useState(t);t!==O$1&&(F(t),S([]));let k=m$2({attributesSchema:n?.attributes??[],actionsComponent:o=>ut({entityName:n?.name??"",entityNamePlural:t??"",row:o}),checkboxSelect:"multiple",enableColumnSorting:true}),f$1=useMemo(()=>{if(r.length===0)return ct;let o=r.map(({id:u,desc:it})=>({[u]:it?"DESC":"ASC"}));return o.some(u=>"_id"in u)?o:[...o,{_id:"DESC"}]},[r]),y=useMemo(()=>{if(r.length!==0)return d(f$1,n)},[n,f$1,r.length]),H=g?{where:{_id:{eq:g}}}:{offset:0,limit:m,sort:f$1,...y?{where:y}:{}},{isLoading:Y,isLoadingMore:Z,fetchMore:b$2,reload:C,count:i,data:l,isProjectDisabled:$}=s({entityNamePlural:t??"",schema:h,scope:j,variables:H,selection:"list"});function tt(o){S(o);}let N=l?.length??0,et=i>0&&N>0&&N<i,ot=useCallback(()=>{b$2({variables:{offset:0,limit:m}});},[b$2]),nt=useCallback(()=>{B(o=>o+1),C();},[C]),rt=Array(m).fill({}),at=pt(k),s$1=Y&&(l==null||l.length===0);return $?jsx("div",{className:"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3",children:jsx(a,{})}):jsxs("div",{className:"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3",children:[jsx(b,{}),jsxs("div",{className:"fk:flex fk:items-center fk:mb-4 fk:gap-2",children:[jsxs(b$1,{children:[jsx(c$1,{asChild:true,children:jsx(O,{className:"fk:-ml-1 fk:w-4 fk:h-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(v,{orientation:"vertical",className:"fk:h-4"}),jsx("h2",{className:"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight",children:ft(n?.menu?.label??n?.plural??"")}),s$1?null:jsxs("span",{className:"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground",children:[i.toLocaleString()," ",i===1?"record":"records"]})]}),G?null:jsx(d$1,{columns:s$1?at:k,data:s$1?rt:l??[],entityName:n?.name??"",hasMore:et,isLoadingMore:Z,pageSize:m,scrollToTopKey:W,sorting:r,onLoadMore:ot,onSortingChange:tt,toolbarComponent:o=>jsx(c$2,{entityName:n?.name??"",isReloading:s$1,onReload:nt,table:o})}),jsx(Outlet,{})]})}function ft(t){return t.charAt(0).toUpperCase()+t.slice(1)}function ut({entityName:t,entityNamePlural:a,row:d}){return jsx(a$1,{entityName:t,entityNamePlural:a,row:d})}function pt(t$1){return t$1.map(a=>({...a,cell:()=>jsx(t,{className:"fk:h-4 fk:w-full",style:{marginTop:"7px",marginBottom:"6px"}})}))}export{vt as List};//# sourceMappingURL=list-DWSTP7CW.js.map
2
- //# sourceMappingURL=list-DWSTP7CW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/apps/desk/list.tsx"],"names":["pageSize","defaultSort","List","entityName","useParams","search","useLocation","entityId","scope","useAppContext","schemaErrorMessage","useGraphQLError","currentProject","useConfig","schema","entitySchema","getEntitySchema","sorting","setSorting","useState","scrollToTopKey","setScrollToTopKey","sortedEntityName","setSortedEntityName","columnsDefinition","useGridColumnsDefinition","row","dataRowActions","graphqlSort","useMemo","primarySort","id","desc","entry","sortNotNullWhere","getSortNotNullWhere","variables","isLoading","isLoadingMore","fetchMore","reload","count","data","isProjectDisabled","useEntityQuery","handleSortingChange","updater","rowsCount","hasMore","handleLoadMore","useCallback","handleReload","key","loadingData","loadingColumns","getLoadingColumns","isInitialLoading","jsx","ProjectDisabled","jsxs","SchemaError","Tooltip","TooltipTrigger","SidebarTrigger","TooltipContent","Separator","capitalize","DataTable","table","DataTableToolbar","Outlet","str","entityNamePlural","DataTableRowActions","columns","column","Skeleton"],"mappings":"s8BAiBA,IAAMA,EAAW,EAAA,CACXC,EAAAA,CAAc,CAAC,CAAE,UAAA,CAAY,MAAO,CAAA,CAAG,CAAE,IAAK,MAAO,CAAC,CAAA,CAErD,SAASC,EAAAA,EAAoB,CAClC,GAAM,CAAE,OAAQC,CAAW,CAAA,CAAIC,SAAAA,EAAU,CACnC,CAAE,MAAA,CAAAC,GAAO,CAAA,CAAIC,aAAY,CAEzBC,CAAAA,CADQ,IAAI,eAAA,CAAgBF,GAAM,CAAA,CACjB,GAAA,CAAI,IAAI,EACzB,CAAE,KAAA,CAAAG,CAAM,CAAA,CAAIC,CAAAA,EAAc,CAC1B,CAAE,kBAAA,CAAAC,CAAmB,CAAA,CAAIC,CAAAA,EAAgB,CACzC,CAAE,cAAA,CAAAC,CAAe,CAAA,CAAIC,CAAAA,EAAU,CAC/BC,CAAAA,CAASF,CAAAA,EAAgB,MAAA,EAAU,EAAC,CACpCG,CAAAA,CAAeC,GAAAA,CAAgBF,EAAQX,CAAAA,EAAc,EAAE,CAAA,CACvD,CAACc,CAAAA,CAASC,CAAU,CAAA,CAAIC,QAAAA,CAAuB,EAAE,CAAA,CACjD,CAACC,CAAAA,CAAgBC,CAAiB,CAAA,CAAIF,QAAAA,CAAS,CAAC,EAChD,CAACG,GAAAA,CAAkBC,CAAmB,CAAA,CAAIJ,QAAAA,CAAShB,CAAU,CAAA,CAE/DA,CAAAA,GAAemB,MACjBC,CAAAA,CAAoBpB,CAAU,CAAA,CAC9Be,CAAAA,CAAW,EAAE,CAAA,CAAA,CAGf,IAAMM,EAAoBC,GAAAA,CAAkD,CAC1E,gBAAA,CAAkBV,CAAAA,EAAc,UAAA,EAAc,EAAC,CAC/C,gBAAA,CAAmBW,GACjBC,EAAAA,CAAe,CAAE,UAAA,CAAYZ,CAAAA,EAAc,IAAA,EAAQ,EAAA,CAAI,gBAAA,CAAkBZ,CAAAA,EAAc,GAAI,GAAA,CAAAuB,CAAI,CAAC,CAAA,CAClG,cAAA,CAAgB,UAAA,CAChB,mBAAA,CAAqB,IACvB,CAAC,CAAA,CAEKE,GAAAA,CAAcC,OAAAA,CAAQ,IAAM,CAChC,GAAIZ,CAAAA,CAAQ,SAAW,CAAA,CACrB,OAAOhB,EAAAA,CAGT,IAAM6B,CAAAA,CAAcb,CAAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,EAAA,CAAAc,CAAAA,CAAI,IAAA,CAAAC,EAAK,CAAA,IAAO,CAAE,CAACD,CAAE,EAAGC,EAAAA,CAAO,MAAA,CAAS,KAAM,CAAA,CAAE,CAAA,CAGnF,OAFkBF,CAAAA,CAAY,IAAA,CAAMG,GAAU,KAAA,GAASA,CAAK,CAAA,CAGnDH,CAAAA,CAIF,CAAC,GAAGA,CAAAA,CAAa,CAAE,IAAK,MAAO,CAAC,CACzC,CAAA,CAAG,CAACb,CAAO,CAAC,CAAA,CACNiB,EAAmBL,OAAAA,CAAQ,IAAM,CACrC,GAAIZ,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAIvB,OAAOkB,EAAoBP,GAAAA,CAAab,CAAY,CACtD,CAAA,CAAG,CAACA,CAAAA,CAAca,GAAAA,CAAaX,CAAAA,CAAQ,MAAM,CAAC,CAAA,CAExCmB,CAAAA,CAAY7B,CAAAA,CACd,CAAE,KAAA,CAAO,CAAE,IAAK,CAAE,EAAA,CAAIA,CAAS,CAAE,CAAE,CAAA,CACnC,CACE,MAAA,CAAQ,EACR,KAAA,CAAOP,CAAAA,CACP,IAAA,CAAM4B,GAAAA,CACN,GAAIM,CAAAA,CAAmB,CAAE,KAAA,CAAOA,CAAiB,CAAA,CAAI,EACvD,CAAA,CAEE,CAAE,SAAA,CAAAG,CAAAA,CAAW,aAAA,CAAAC,EAAe,SAAA,CAAAC,GAAAA,CAAW,MAAA,CAAAC,CAAAA,CAAQ,KAAA,CAAAC,CAAAA,CAAO,IAAA,CAAAC,CAAAA,CAAM,kBAAAC,CAAkB,CAAA,CAAIC,CAAAA,CAAe,CACrG,gBAAA,CAAkBzC,CAAAA,EAAc,EAAA,CAChC,MAAA,CAAAW,EACA,KAAA,CAAAN,CAAAA,CACA,SAAA,CAAA4B,CAAAA,CACA,SAAA,CAAW,MACb,CAAC,CAAA,CAED,SAASS,EAAAA,CAAoBC,CAAAA,CAAsC,CACjE5B,CAAAA,CAAW4B,CAAO,EACpB,CAEA,IAAMC,CAAAA,CAAYL,CAAAA,EAAM,MAAA,EAAU,CAAA,CAC5BM,EAAAA,CAAUP,CAAAA,CAAQ,CAAA,EAAKM,CAAAA,CAAY,GAAKA,CAAAA,CAAYN,CAAAA,CAEpDQ,EAAAA,CAAiBC,WAAAA,CAAY,IAAM,CACvCX,GAAAA,CAAU,CACR,UAAW,CAET,MAAA,CAAQ,CAAA,CACR,KAAA,CAAOvC,CACT,CACF,CAAC,EACH,EAAG,CAACuC,GAAS,CAAC,CAAA,CAERY,EAAAA,CAAeD,WAAAA,CAAY,IAAM,CACrC7B,EAAmB+B,CAAAA,EAAQA,CAAAA,CAAM,CAAC,CAAA,CAClCZ,CAAAA,GACF,CAAA,CAAG,CAACA,CAAM,CAAC,CAAA,CAELa,EAAAA,CAAc,KAAA,CAAMrD,CAAQ,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CACrCsD,EAAAA,CAAiBC,EAAAA,CAAkB/B,CAAiB,CAAA,CACpDgC,GAAAA,CAAmBnB,CAAAA,GAAcK,CAAAA,EAAQ,MAAQA,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAA,CAEvE,OAAIC,CAAAA,CAEAc,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,+CAAA,CACb,QAAA,CAAAA,GAAAA,CAACC,CAAAA,CAAA,EAAgB,CAAA,CACnB,CAAA,CAKFC,IAAAA,CAAC,OAAI,SAAA,CAAU,+CAAA,CACb,QAAA,CAAA,CAAAF,GAAAA,CAACG,CAAAA,CAAA,EAAY,CAAA,CACbD,IAAAA,CAAC,OAAI,SAAA,CAAU,0CAAA,CACb,QAAA,CAAA,CAAAA,IAAAA,CAACE,GAAAA,CAAA,CACC,QAAA,CAAA,CAAAJ,GAAAA,CAACK,IAAA,CAAe,OAAA,CAAO,IAAA,CACrB,QAAA,CAAAL,GAAAA,CAACM,CAAAA,CAAA,CAAe,SAAA,CAAU,yBAAyB,CAAA,CACrD,CAAA,CACAN,GAAAA,CAACO,GAAAA,CAAA,CAAe,QAAA,CAAA,gBAAA,CAAc,CAAA,CAAA,CAChC,CAAA,CACAP,IAACQ,CAAAA,CAAA,CAAU,WAAA,CAAY,UAAA,CAAW,SAAA,CAAU,QAAA,CAAS,CAAA,CACrDR,GAAAA,CAAC,MAAG,SAAA,CAAU,+DAAA,CACX,QAAA,CAAAS,EAAAA,CAAWnD,CAAAA,EAAc,IAAA,EAAM,KAAA,EAASA,CAAAA,EAAc,QAAU,EAAE,CAAA,CACrE,CAAA,CACEyC,GAAAA,CAIE,IAAA,CAHFG,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,+DAAA,CACb,QAAA,CAAA,CAAAlB,CAAAA,CAAM,cAAA,EAAe,CAAE,GAAA,CAAEA,CAAAA,GAAU,CAAA,CAAI,SAAW,SAAA,CAAA,CACrD,CAAA,CAAA,CAEJ,CAAA,CACE/B,CAAAA,CAqBE,IAAA,CApBF+C,GAAAA,CAACU,GAAAA,CAAA,CACC,QAASX,GAAAA,CAAmBF,EAAAA,CAAiB9B,CAAAA,CAC7C,IAAA,CAAMgC,GAAAA,CAAmBH,EAAAA,CAAeX,CAAAA,EAAQ,GAChD,UAAA,CAAY3B,CAAAA,EAAc,IAAA,EAAQ,EAAA,CAClC,OAAA,CAASiC,EAAAA,CACT,aAAA,CAAeV,CAAAA,CACf,SAAUtC,CAAAA,CACV,cAAA,CAAgBoB,CAAAA,CAChB,OAAA,CAASH,CAAAA,CACT,UAAA,CAAYgC,EAAAA,CACZ,eAAA,CAAiBJ,GACjB,gBAAA,CAAmBuB,CAAAA,EACjBX,GAAAA,CAACY,GAAAA,CAAA,CACC,UAAA,CAAYtD,CAAAA,EAAc,IAAA,EAAQ,GAClC,WAAA,CAAayC,GAAAA,CACb,QAAA,CAAUL,EAAAA,CACV,KAAA,CAAOiB,CAAAA,CACT,CAAA,CAEJ,CAAA,CAEFX,IAACa,MAAAA,CAAA,EAAO,CAAA,CAAA,CACV,CAEJ,CAEA,SAASJ,EAAAA,CAAWK,CAAAA,CAAqB,CACvC,OAAOA,CAAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CAAIA,EAAI,KAAA,CAAM,CAAC,CAClD,CAQA,SAAS5C,EAAAA,CAAe,CAAE,UAAA,CAAAxB,EAAY,gBAAA,CAAAqE,CAAAA,CAAkB,GAAA,CAAA9C,CAAI,CAAA,CAAgC,CAC1F,OAAO+B,GAAAA,CAACgB,IAAA,CAAoB,UAAA,CAAYtE,CAAAA,CAAY,gBAAA,CAAkBqE,CAAAA,CAAkB,GAAA,CAAK9C,CAAAA,CAAK,CACpG,CAEA,SAAS6B,EAAAA,CAAkBmB,GAAAA,CAAqF,CAC9G,OAAOA,GAAAA,CAAQ,GAAA,CAAKC,CAAAA,GAAY,CAC9B,GAAGA,CAAAA,CACH,IAAA,CAAM,IAAMlB,GAAAA,CAACmB,CAAAA,CAAA,CAAS,SAAA,CAAU,mBAAmB,KAAA,CAAO,CAAE,SAAA,CAAW,KAAA,CAAO,YAAA,CAAc,KAAM,CAAA,CAAG,CACvG,EAAE,CACJ","file":"list-DWSTP7CW.js","sourcesContent":["import { JSX, useCallback, useMemo, useState } from 'react';\nimport { useLocation, useParams, Outlet } from 'react-router-dom';\nimport type { ColumnDef, Row, SortingState, Updater } from '@tanstack/react-table';\nimport { getEntitySchema, getSortNotNullWhere } from '../../graphql-client/queries';\nimport { useAppContext } from '../../core/app-context';\nimport { useConfig } from '../../core/config/config-context';\nimport { useEntityQuery } from '../../graphql-client/use-entity-query';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\nimport { ProjectDisabled } from '../../core/error/project-disabled';\nimport { SchemaError } from '../../core/error/schema-error';\nimport { DataTable } from '../../data-grid/data-table';\nimport { DataTableRowActions } from '../../data-grid/data-table-row-actions';\nimport { DataTableToolbar } from '../../data-grid/data-table-toolbar';\nimport { useGridColumnsDefinition } from '../../data-grid/columns';\nimport type { AttributeValue } from '../../graphql-client/types';\nimport { Skeleton, SidebarTrigger, Separator, Tooltip, TooltipContent, TooltipTrigger } from '../../ui';\n\nconst pageSize = 36;\nconst defaultSort = [{ _updatedAt: 'DESC' }, { _id: 'DESC' }];\n\nexport function List(): JSX.Element {\n const { entity: entityName } = useParams();\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const entityId = query.get('id');\n const { scope } = useAppContext();\n const { schemaErrorMessage } = useGraphQLError();\n const { currentProject } = useConfig();\n const schema = currentProject?.schema ?? [];\n const entitySchema = getEntitySchema(schema, entityName ?? '');\n const [sorting, setSorting] = useState<SortingState>([]);\n const [scrollToTopKey, setScrollToTopKey] = useState(0);\n const [sortedEntityName, setSortedEntityName] = useState(entityName);\n\n if (entityName !== sortedEntityName) {\n setSortedEntityName(entityName);\n setSorting([]);\n }\n\n const columnsDefinition = useGridColumnsDefinition<AttributeValue, unknown>({\n attributesSchema: entitySchema?.attributes ?? [],\n actionsComponent: (row) =>\n dataRowActions({ entityName: entitySchema?.name ?? '', entityNamePlural: entityName ?? '', row }),\n checkboxSelect: 'multiple',\n enableColumnSorting: true,\n });\n\n const graphqlSort = useMemo(() => {\n if (sorting.length === 0) {\n return defaultSort;\n }\n\n const primarySort = sorting.map(({ id, desc }) => ({ [id]: desc ? 'DESC' : 'ASC' }));\n const hasIdSort = primarySort.some((entry) => '_id' in entry);\n\n if (hasIdSort) {\n return primarySort;\n }\n\n // Tie-break so offset pages stay stable when sort values collide.\n return [...primarySort, { _id: 'DESC' }];\n }, [sorting]);\n const sortNotNullWhere = useMemo(() => {\n if (sorting.length === 0) {\n return undefined;\n }\n\n return getSortNotNullWhere(graphqlSort, entitySchema);\n }, [entitySchema, graphqlSort, sorting.length]);\n\n const variables = entityId\n ? { where: { _id: { eq: entityId } } }\n : {\n offset: 0,\n limit: pageSize,\n sort: graphqlSort,\n ...(sortNotNullWhere ? { where: sortNotNullWhere } : {}),\n };\n\n const { isLoading, isLoadingMore, fetchMore, reload, count, data, isProjectDisabled } = useEntityQuery({\n entityNamePlural: entityName ?? '',\n schema,\n scope,\n variables,\n selection: 'list',\n });\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n setSorting(updater);\n }\n\n const rowsCount = data?.length ?? 0;\n const hasMore = count > 0 && rowsCount > 0 && rowsCount < count;\n\n const handleLoadMore = useCallback(() => {\n fetchMore({\n variables: {\n // Offset is tracked inside useEntityQuery from page windows; value here is ignored.\n offset: 0,\n limit: pageSize,\n },\n });\n }, [fetchMore]);\n\n const handleReload = useCallback(() => {\n setScrollToTopKey((key) => key + 1);\n reload();\n }, [reload]);\n\n const loadingData = Array(pageSize).fill({});\n const loadingColumns = getLoadingColumns(columnsDefinition);\n const isInitialLoading = isLoading && (data == null || data.length === 0);\n\n if (isProjectDisabled) {\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3\">\n <ProjectDisabled />\n </div>\n );\n }\n\n return (\n <div className=\"fk:flex fk:flex-col fk:h-full fk:px-4 fk:pt-3\">\n <SchemaError />\n <div className=\"fk:flex fk:items-center fk:mb-4 fk:gap-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <SidebarTrigger className=\"fk:-ml-1 fk:w-4 fk:h-4\" />\n </TooltipTrigger>\n <TooltipContent>Toggle Sidebar</TooltipContent>\n </Tooltip>\n <Separator orientation=\"vertical\" className=\"fk:h-4\" />\n <h2 className=\"fk:text-lg fk:font-semibold fk:leading-none fk:tracking-tight\">\n {capitalize(entitySchema?.menu?.label ?? entitySchema?.plural ?? '')}\n </h2>\n {!isInitialLoading ? (\n <span className=\"fk:ml-auto fk:text-sm fk:font-normal fk:text-muted-foreground\">\n {count.toLocaleString()} {count === 1 ? 'record' : 'records'}\n </span>\n ) : null}\n </div>\n {!schemaErrorMessage ? (\n <DataTable\n columns={isInitialLoading ? loadingColumns : columnsDefinition}\n data={isInitialLoading ? loadingData : (data ?? [])}\n entityName={entitySchema?.name ?? ''}\n hasMore={hasMore}\n isLoadingMore={isLoadingMore}\n pageSize={pageSize}\n scrollToTopKey={scrollToTopKey}\n sorting={sorting}\n onLoadMore={handleLoadMore}\n onSortingChange={handleSortingChange}\n toolbarComponent={(table) => (\n <DataTableToolbar\n entityName={entitySchema?.name ?? ''}\n isReloading={isInitialLoading}\n onReload={handleReload}\n table={table}\n />\n )}\n />\n ) : null}\n <Outlet />\n </div>\n );\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\ntype DataRowActions = {\n entityName: string;\n entityNamePlural: string;\n row: Row<AttributeValue>;\n};\n\nfunction dataRowActions({ entityName, entityNamePlural, row }: DataRowActions): JSX.Element {\n return <DataTableRowActions entityName={entityName} entityNamePlural={entityNamePlural} row={row} />;\n}\n\nfunction getLoadingColumns(columns: ColumnDef<AttributeValue, unknown>[]): ColumnDef<AttributeValue, unknown>[] {\n return columns.map((column) => ({\n ...column,\n cell: () => <Skeleton className=\"fk:h-4 fk:w-full\" style={{ marginTop: '7px', marginBottom: '6px' }} />,\n }));\n}\n"]}
@@ -1,2 +0,0 @@
1
- import'./index.css';export{a as EntityKnowledgeButton,c as LinkedRecordsSection,b as RecordKnowledgePanel}from'./chunk-A6UGAPMZ.js';import'./chunk-MNFVAW2B.js';import'./chunk-2NXQF2F7.js';import'./chunk-BQWW2Q6B.js';import'./chunk-V7C4EHK3.js';import'./chunk-LBFL34FM.js';import'./chunk-XMOSCJOI.js';import'./chunk-7KLXWCDS.js';import'./chunk-HKN6BX5U.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import'./chunk-4TQ25SVS.js';import'./chunk-WPCPL2TQ.js';import'./chunk-5CVDMZUI.js';import'./chunk-DGIY4SKN.js';import'./chunk-SZEGGBOC.js';import'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import'./chunk-USNXQOMJ.js';import'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';//# sourceMappingURL=record-links-DSRYOOM5.js.map
2
- //# sourceMappingURL=record-links-DSRYOOM5.js.map