@flexkit/studio 0.2.32 → 0.2.33

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 (153) hide show
  1. package/dist/activity-nav-button-ZHQOZBCC.js +2 -0
  2. package/dist/{activity-nav-button-E4I4YC3X.js.map → activity-nav-button-ZHQOZBCC.js.map} +1 -1
  3. package/dist/astro.js +1 -1
  4. package/dist/chat-page-LR7XC2US.js +4 -0
  5. package/dist/{chat-page-7UB3BMBF.js.map → chat-page-LR7XC2US.js.map} +1 -1
  6. package/dist/chunk-2MVQXXY7.js +4 -0
  7. package/dist/{chunk-R2O4WC3H.js.map → chunk-2MVQXXY7.js.map} +1 -1
  8. package/dist/{chunk-ERCVR23U.js → chunk-36DLIVZF.js} +2 -2
  9. package/dist/{chunk-ERCVR23U.js.map → chunk-36DLIVZF.js.map} +1 -1
  10. package/dist/chunk-3SY46ERM.js +2 -0
  11. package/dist/chunk-3SY46ERM.js.map +1 -0
  12. package/dist/chunk-4ZWQ44NZ.js +2 -0
  13. package/dist/{chunk-2NXQF2F7.js.map → chunk-4ZWQ44NZ.js.map} +1 -1
  14. package/dist/chunk-5JUG4BEF.js +2 -0
  15. package/dist/chunk-5JUG4BEF.js.map +1 -0
  16. package/dist/chunk-6I7D2JBA.js +3 -0
  17. package/dist/chunk-6I7D2JBA.js.map +1 -0
  18. package/dist/chunk-7ODGH7G2.js +2 -0
  19. package/dist/{chunk-5LGIALCK.js.map → chunk-7ODGH7G2.js.map} +1 -1
  20. package/dist/{chunk-SZEGGBOC.js → chunk-A4DPLZZF.js} +2 -2
  21. package/dist/{chunk-SZEGGBOC.js.map → chunk-A4DPLZZF.js.map} +1 -1
  22. package/dist/{chunk-C4XLDODU.js → chunk-C2KPTRYM.js} +3 -1
  23. package/dist/chunk-C3OHXPJV.js +2 -0
  24. package/dist/chunk-C3OHXPJV.js.map +1 -0
  25. package/dist/{chunk-KR27GOH6.js → chunk-CFYO546Y.js} +3 -3
  26. package/dist/{chunk-KR27GOH6.js.map → chunk-CFYO546Y.js.map} +1 -1
  27. package/dist/chunk-DHE6PO3V.js +2 -0
  28. package/dist/{chunk-5AJXR47U.js.map → chunk-DHE6PO3V.js.map} +1 -1
  29. package/dist/{chunk-V7C4EHK3.js → chunk-DSLPTDZX.js} +2 -2
  30. package/dist/{chunk-V7C4EHK3.js.map → chunk-DSLPTDZX.js.map} +1 -1
  31. package/dist/chunk-HSGUVQXU.js +10 -0
  32. package/dist/{chunk-JAPZBEBZ.js.map → chunk-HSGUVQXU.js.map} +1 -1
  33. package/dist/{chunk-EMFHKTAV.js → chunk-K3HW6YWS.js} +2 -2
  34. package/dist/{chunk-EMFHKTAV.js.map → chunk-K3HW6YWS.js.map} +1 -1
  35. package/dist/chunk-L5T56MRH.js +7 -0
  36. package/dist/chunk-L5T56MRH.js.map +1 -0
  37. package/dist/chunk-MBBE4RND.js +3 -0
  38. package/dist/chunk-MBBE4RND.js.map +1 -0
  39. package/dist/{chunk-USNXQOMJ.js → chunk-N33S7BSG.js} +2 -2
  40. package/dist/{chunk-USNXQOMJ.js.map → chunk-N33S7BSG.js.map} +1 -1
  41. package/dist/{chunk-KN7OJFEX.js → chunk-N52JTYBJ.js} +2 -2
  42. package/dist/{chunk-KN7OJFEX.js.map → chunk-N52JTYBJ.js.map} +1 -1
  43. package/dist/{chunk-AY2RXJWS.js → chunk-NFEQBTIW.js} +2 -2
  44. package/dist/{chunk-AY2RXJWS.js.map → chunk-NFEQBTIW.js.map} +1 -1
  45. package/dist/chunk-RFUMT6ZR.js +2 -0
  46. package/dist/{chunk-JWJJZVP3.js.map → chunk-RFUMT6ZR.js.map} +1 -1
  47. package/dist/{chunk-GSGPULRL.js → chunk-RLVHUIFC.js} +2 -2
  48. package/dist/{chunk-GSGPULRL.js.map → chunk-RLVHUIFC.js.map} +1 -1
  49. package/dist/chunk-S26WK6RF.js +2 -0
  50. package/dist/{chunk-54AXLGAK.js.map → chunk-S26WK6RF.js.map} +1 -1
  51. package/dist/{chunk-ONB3FWK5.js → chunk-S7VNSSIK.js} +2 -2
  52. package/dist/{chunk-ONB3FWK5.js.map → chunk-S7VNSSIK.js.map} +1 -1
  53. package/dist/chunk-S7Z6KKIN.js +2 -0
  54. package/dist/chunk-S7Z6KKIN.js.map +1 -0
  55. package/dist/{chunk-2NQ2RZ2M.js → chunk-U5XZWEPO.js} +3 -3
  56. package/dist/{chunk-2NQ2RZ2M.js.map → chunk-U5XZWEPO.js.map} +1 -1
  57. package/dist/chunk-UB22GYFK.js +2 -0
  58. package/dist/{chunk-MRHZN4G4.js.map → chunk-UB22GYFK.js.map} +1 -1
  59. package/dist/chunk-VUZ7GHSO.js +7 -0
  60. package/dist/{chunk-NNISUDZX.js.map → chunk-VUZ7GHSO.js.map} +1 -1
  61. package/dist/chunk-X3SHNHHM.js +2 -0
  62. package/dist/chunk-X3SHNHHM.js.map +1 -0
  63. package/dist/{chunk-XV7U33XQ.js → chunk-YKM3FUGK.js} +3 -3
  64. package/dist/{chunk-XV7U33XQ.js.map → chunk-YKM3FUGK.js.map} +1 -1
  65. package/dist/electron.js +1 -1
  66. package/dist/{entry-CA2QAEHN.js → entry-ROTT3ZDN.js} +2 -2
  67. package/dist/{entry-CA2QAEHN.js.map → entry-ROTT3ZDN.js.map} +1 -1
  68. package/dist/index.d.ts +10 -1
  69. package/dist/index.js +7 -7
  70. package/dist/index.js.map +1 -1
  71. package/dist/list-N4E3VXM5.js +3 -0
  72. package/dist/{list-Q2KAEJ26.js.map → list-N4E3VXM5.js.map} +1 -1
  73. package/dist/list-RCTHBJOK.js +2 -0
  74. package/dist/{list-UMMVRYVD.js.map → list-RCTHBJOK.js.map} +1 -1
  75. package/dist/nextjs.js +1 -1
  76. package/dist/pages-XUJGIHQI.js +5 -0
  77. package/dist/{pages-KZ66JVNU.js.map → pages-XUJGIHQI.js.map} +1 -1
  78. package/dist/plugin-pages-FEQILAQR.js +2 -0
  79. package/dist/{plugin-pages-SR2WSUKZ.js.map → plugin-pages-FEQILAQR.js.map} +1 -1
  80. package/dist/project-selector-U64ROZ5D.js +2 -0
  81. package/dist/project-selector-U64ROZ5D.js.map +1 -0
  82. package/dist/record-links-HO4SEHOA.js +2 -0
  83. package/dist/{record-links-3WZGSVFU.js.map → record-links-HO4SEHOA.js.map} +1 -1
  84. package/dist/root-BUXIQKA5.js +14 -0
  85. package/dist/{root-LFJ5BQSY.js.map → root-BUXIQKA5.js.map} +1 -1
  86. package/dist/root-CCUROZVR.js +2 -0
  87. package/dist/{root-6QTQUYK4.js.map → root-CCUROZVR.js.map} +1 -1
  88. package/dist/root-GQL3P63Z.js +31 -0
  89. package/dist/{root-7BUVDOMV.js.map → root-GQL3P63Z.js.map} +1 -1
  90. package/dist/root-KXY4A6DW.js +2 -0
  91. package/dist/{root-2VBLPRG7.js.map → root-KXY4A6DW.js.map} +1 -1
  92. package/dist/root-MLEJUEMJ.js +23 -0
  93. package/dist/{root-FZLKYL5W.js.map → root-MLEJUEMJ.js.map} +1 -1
  94. package/dist/root-VA3E6HEY.js +2 -0
  95. package/dist/{root-OXS3QQX6.js.map → root-VA3E6HEY.js.map} +1 -1
  96. package/dist/search-YY4GQQRM.js +2 -0
  97. package/dist/{search-AZK3Q2KX.js.map → search-YY4GQQRM.js.map} +1 -1
  98. package/dist/skills-pages-SAOZTUOH.js +2 -0
  99. package/dist/{skills-pages-7IYBJ4QI.js.map → skills-pages-SAOZTUOH.js.map} +1 -1
  100. package/dist/source-2S24MZ5D.js +2 -0
  101. package/dist/{source-4BP5PJ2N.js.map → source-2S24MZ5D.js.map} +1 -1
  102. package/dist/spec-renderer-ZSIVMKVE.js +2 -0
  103. package/dist/{spec-renderer-3GAVSV52.js.map → spec-renderer-ZSIVMKVE.js.map} +1 -1
  104. package/dist/tanstack-start.js +1 -1
  105. package/dist/ui.js +1 -1
  106. package/dist/user-nav-ZH63YHX7.js +2 -0
  107. package/dist/{user-nav-OWTTAXZS.js.map → user-nav-ZH63YHX7.js.map} +1 -1
  108. package/package.json +4 -4
  109. package/dist/activity-nav-button-E4I4YC3X.js +0 -2
  110. package/dist/chat-page-7UB3BMBF.js +0 -4
  111. package/dist/chunk-2NXQF2F7.js +0 -2
  112. package/dist/chunk-32ZU4MLE.js +0 -2
  113. package/dist/chunk-32ZU4MLE.js.map +0 -1
  114. package/dist/chunk-54AXLGAK.js +0 -2
  115. package/dist/chunk-5AJXR47U.js +0 -2
  116. package/dist/chunk-5LGIALCK.js +0 -2
  117. package/dist/chunk-6NRQMG26.js +0 -2
  118. package/dist/chunk-6NRQMG26.js.map +0 -1
  119. package/dist/chunk-AKQ6ELDX.js +0 -2
  120. package/dist/chunk-AKQ6ELDX.js.map +0 -1
  121. package/dist/chunk-DGIY4SKN.js +0 -7
  122. package/dist/chunk-DGIY4SKN.js.map +0 -1
  123. package/dist/chunk-HDOIOXMP.js +0 -2
  124. package/dist/chunk-HDOIOXMP.js.map +0 -1
  125. package/dist/chunk-HZOD2HOF.js +0 -3
  126. package/dist/chunk-HZOD2HOF.js.map +0 -1
  127. package/dist/chunk-JAPZBEBZ.js +0 -10
  128. package/dist/chunk-JWJJZVP3.js +0 -2
  129. package/dist/chunk-MRHZN4G4.js +0 -2
  130. package/dist/chunk-NNISUDZX.js +0 -7
  131. package/dist/chunk-O2QMYUPS.js +0 -2
  132. package/dist/chunk-O2QMYUPS.js.map +0 -1
  133. package/dist/chunk-R2O4WC3H.js +0 -4
  134. package/dist/chunk-WPCPL2TQ.js +0 -3
  135. package/dist/chunk-WPCPL2TQ.js.map +0 -1
  136. package/dist/list-Q2KAEJ26.js +0 -3
  137. package/dist/list-UMMVRYVD.js +0 -2
  138. package/dist/pages-KZ66JVNU.js +0 -5
  139. package/dist/plugin-pages-SR2WSUKZ.js +0 -2
  140. package/dist/project-selector-72VM6SUI.js +0 -2
  141. package/dist/project-selector-72VM6SUI.js.map +0 -1
  142. package/dist/record-links-3WZGSVFU.js +0 -2
  143. package/dist/root-2VBLPRG7.js +0 -2
  144. package/dist/root-6QTQUYK4.js +0 -2
  145. package/dist/root-7BUVDOMV.js +0 -31
  146. package/dist/root-FZLKYL5W.js +0 -23
  147. package/dist/root-LFJ5BQSY.js +0 -14
  148. package/dist/root-OXS3QQX6.js +0 -2
  149. package/dist/search-AZK3Q2KX.js +0 -2
  150. package/dist/skills-pages-7IYBJ4QI.js +0 -2
  151. package/dist/source-4BP5PJ2N.js +0 -2
  152. package/dist/spec-renderer-3GAVSV52.js +0 -2
  153. package/dist/user-nav-OWTTAXZS.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-4BP5PJ2N.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-2S24MZ5D.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"]}
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {fa,ga,ha,Z,ea,_,ba,ca,$,da,ia,e}from'./chunk-L5T56MRH.js';import {t}from'./chunk-A4DPLZZF.js';import'./chunk-3SY46ERM.js';import {l,b as b$1}from'./chunk-5JUG4BEF.js';import'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';import'./chunk-N33S7BSG.js';import'./chunk-X3SHNHHM.js';import {useMemo,useId,useState,useEffect}from'react';import {buildSpecFromParts,StateProvider,VisibilityProvider,ActionProvider,Renderer}from'@json-render/react';import {TrendingUpIcon,TrendingDownIcon,MinusIcon,InfoIcon,OctagonAlertIcon,AlertTriangleIcon,LightbulbIcon,XCircleIcon,CheckCircle2Icon}from'lucide-react';import {PieChart,Tooltip,Pie,Cell,LineChart,CartesianGrid,XAxis,YAxis,Line,BarChart,Bar,ResponsiveContainer}from'recharts';import {jsx,jsxs}from'react/jsx-runtime';var ke={sm:"fk:max-w-sm",md:"fk:max-w-md",lg:"fk:max-w-lg",full:"fk:max-w-full"},pe=({children:e,element:t})=>{let{props:n}=t,s=n.maxWidth?ke[n.maxWidth]:"",a=n.centered?"fk:mx-auto":"";return jsxs("div",{className:`fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:gap-2 fk:flex fk:flex-col ${s} ${a} ${n.className??""} fk:corner-squircle`,children:[n.title&&jsx("div",{className:"fk:text-sm fk:font-medium",children:n.title}),n.description&&jsx("div",{className:"fk:mt-0.5 fk:text-xs fk:text-muted-foreground",children:n.description}),(n.title??n.description)&&e?jsx("div",{className:"fk:mt-3"}):null,e]})},me={none:"fk:gap-0",sm:"fk:gap-2",md:"fk:gap-3",lg:"fk:gap-4",xl:"fk:gap-6"},ge={start:"fk:items-start",center:"fk:items-center",end:"fk:items-end",stretch:"fk:items-stretch"},he={start:"fk:justify-start",center:"fk:justify-center",end:"fk:justify-end",between:"fk:justify-between",around:"fk:justify-around"},be=({children:e,element:t})=>{let{props:n}=t,s=n.direction==="horizontal"?"fk:flex-row fk:flex-wrap":"fk:flex-col",a=me[n.gap??"md"],i=n.align?ge[n.align]:"",l=n.justify?he[n.justify]:"";return jsx("div",{className:`fk:flex fk:w-full ${s} ${a} ${i} ${l} ${n.className??""}`,children:e})},ve={1:"fk:grid-cols-1",2:"fk:grid-cols-2",3:"fk:grid-cols-3",4:"fk:grid-cols-4",5:"fk:grid-cols-5",6:"fk:grid-cols-6"},ye={sm:"fk:gap-2",md:"fk:gap-3",lg:"fk:gap-4",xl:"fk:gap-6"},xe=({children:e,element:t})=>{let{props:n}=t,s=ve[n.columns??1]??"fk:grid-cols-1",a=ye[n.gap??"md"];return jsx("div",{className:`fk:grid fk:w-full ${s} ${a} ${n.className??""}`,children:e})},Ce=({element:e})=>jsx(l,{orientation:e.props.orientation??"horizontal"}),Pe={h1:"fk:text-xl fk:font-semibold fk:tracking-tight",h2:"fk:text-lg fk:font-semibold fk:tracking-tight",h3:"fk:text-base fk:font-medium",h4:"fk:text-sm fk:font-medium"},we=({element:e})=>{let t=e.props.level??"h2";return jsx(t,{className:Pe[t],children:e.props.text})},Ne={body:"fk:text-sm",muted:"fk:text-sm fk:text-muted-foreground",caption:"fk:text-xs fk:text-muted-foreground",lead:"fk:text-base",code:"fk:rounded fk:bg-muted fk:px-1 fk:py-0.5 fk:font-mono fk:text-xs fk:corner-squircle"},Se=({element:e})=>jsx("p",{className:Ne[e.props.variant??"body"],children:e.props.text}),Te=({element:e})=>jsx(b$1,{variant:e.props.variant??"default",children:e.props.text});function Re({type:e}){switch(e){case "success":return jsx(CheckCircle2Icon,{className:"fk:size-4 fk:translate-y-0.5"});case "warning":return jsx(AlertTriangleIcon,{className:"fk:size-4 fk:translate-y-0.5"});case "error":return jsx(XCircleIcon,{className:"fk:size-4 fk:translate-y-0.5"});default:return jsx(InfoIcon,{className:"fk:size-4 fk:translate-y-0.5"})}}var Ae=({element:e})=>{let{props:t}=e,n=t.type==="error"?"fk:border-destructive/50 fk:text-destructive":"fk:text-foreground";return jsxs("div",{className:`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:bg-card fk:px-4 fk:py-3 fk:text-sm ${n} fk:corner-squircle`,role:"alert",children:[jsx(Re,{type:t.type}),jsxs("div",{className:"fk:min-w-0",children:[jsx("div",{className:"fk:font-medium",children:t.title}),t.message&&jsx("div",{className:"fk:text-muted-foreground",children:t.message})]})]})},Le=({element:e})=>{let t=e.props.columns??[],n=(e.props.rows??[]).map(s=>s.map(String));return jsx("div",{className:"fk:w-full fk:overflow-hidden fk:rounded-md fk:mt-2 fk:corner-squircle",children:jsxs(Z,{children:[e.props.caption&&jsx(ea,{children:e.props.caption}),jsx(_,{children:jsx(ba,{children:t.map((s,a)=>jsx(ca,{children:s},`${a.toString()}-${s}`))})}),jsx($,{children:n.map((s,a)=>jsx(ba,{children:s.map((i,l)=>jsx(da,{children:i},l))},a))})]})})},ze=({element:e})=>{let{props:t}=e,n=t.max??100,s=n>0?Math.min(100,Math.max(0,t.value/n*100)):0;return jsxs("div",{className:"fk:w-full",children:[t.label&&jsxs("div",{className:"fk:mb-1 fk:flex fk:items-center fk:justify-between fk:text-xs fk:text-muted-foreground",children:[jsx("span",{children:t.label}),jsxs("span",{className:"fk:tabular-nums",children:[Math.round(s),"%"]})]}),jsx("div",{className:"fk:h-2 fk:w-full fk:overflow-hidden fk:rounded-full fk:bg-secondary fk:corner-squircle",children:jsx("div",{className:"fk:h-full fk:rounded-full fk:bg-primary fk:corner-squircle",style:{width:`${s.toString()}%`}})})]})},Ke=({element:e})=>jsx(t,{className:e.props.rounded?"fk:rounded-full fk:corner-squircle":"",style:{height:e.props.height??"1rem",width:e.props.width??"100%"}}),Me=({element:e$1})=>jsx(e,{href:e$1.props.href,children:e$1.props.label}),$e=({element:e})=>e.props.src?jsx("img",{alt:e.props.alt,className:"fk:max-w-full fk:rounded-md fk:corner-squircle",height:e.props.height??void 0,src:e.props.src,width:e.props.width??void 0}):null,Ie=({element:e})=>jsx("div",{className:"fk:w-full fk:divide-y fk:divide-border fk:rounded-md fk:border fk:border-border fk:corner-squircle",children:(e.props.items??[]).map((t,n)=>jsxs("details",{className:"fk:group fk:px-4 fk:py-3",children:[jsx("summary",{className:"fk:cursor-pointer fk:list-none fk:text-sm fk:font-medium",children:t.title}),jsx("p",{className:"fk:mt-2 fk:text-sm fk:text-muted-foreground",children:t.content})]},n))}),Ee=({children:e,element:t})=>{let n=t.props.tabs??[];return jsxs(fa,{defaultValue:t.props.value??t.props.defaultValue??n[0]?.value,children:[jsx(ga,{children:n.map(s=>jsx(ha,{value:s.value,children:s.label},s.value))}),e]})},qe=({children:e,element:t})=>jsx(ia,{value:t.props.value,children:e}),je={up:"fk:text-success",down:"fk:text-destructive",neutral:"fk:text-muted-foreground"};function Be({trend:e}){return e==="up"?jsx(TrendingUpIcon,{className:"fk:size-4"}):e==="down"?jsx(TrendingDownIcon,{className:"fk:size-4"}):jsx(MinusIcon,{className:"fk:size-4"})}var He=({element:e})=>{let{props:t}=e;return jsxs("div",{className:"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle",children:[jsx("div",{className:"fk:text-xs fk:font-medium fk:text-muted-foreground",children:t.label}),jsxs("div",{className:"fk:mt-1 fk:flex fk:items-center fk:gap-2",children:[jsx("span",{className:"fk:text-2xl fk:font-semibold fk:tabular-nums fk:tracking-tight",children:t.value}),t.trend&&jsx("span",{className:je[t.trend],children:jsx(Be,{trend:t.trend})})]}),t.detail&&jsx("div",{className:"fk:mt-1 fk:text-xs fk:text-muted-foreground",children:t.detail})]})},Je={info:"fk:border-blue-500/30 fk:bg-blue-500/5 fk:text-blue-700 fk:dark:text-blue-400",tip:"fk:border-emerald-500/30 fk:bg-emerald-500/5 fk:text-emerald-700 fk:dark:text-emerald-400",warning:"fk:border-amber-500/30 fk:bg-amber-500/5 fk:text-amber-700 fk:dark:text-amber-400",important:"fk:border-red-500/30 fk:bg-red-500/5 fk:text-red-700 fk:dark:text-red-400"};function Xe({type:e}){switch(e){case "tip":return jsx(LightbulbIcon,{className:"fk:size-4 fk:shrink-0 fk:translate-y-0.5"});case "warning":return jsx(AlertTriangleIcon,{className:"fk:size-4 fk:shrink-0 fk:translate-y-0.5"});case "important":return jsx(OctagonAlertIcon,{className:"fk:size-4 fk:shrink-0 fk:translate-y-0.5"});default:return jsx(InfoIcon,{className:"fk:size-4 fk:shrink-0 fk:translate-y-0.5"})}}var Fe=({element:e})=>{let{props:t}=e,n=t.type??"info";return jsxs("div",{className:`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:px-4 fk:py-3 fk:text-sm ${Je[n]} fk:corner-squircle`,children:[jsx(Xe,{type:n}),jsxs("div",{className:"fk:min-w-0",children:[t.title&&jsx("div",{className:"fk:font-medium",children:t.title}),jsx("div",{className:"fk:text-foreground",children:t.content})]})]})},Oe={completed:"fk:border-success fk:bg-success",current:"fk:border-primary fk:bg-primary",upcoming:"fk:border-border fk:bg-background"},Ge=({element:e})=>jsx("div",{className:"fk:w-full",children:(e.props.items??[]).map((t,n,s)=>jsxs("div",{className:"fk:relative fk:flex fk:gap-3 fk:pb-4 fk:last:pb-0",children:[n<s.length-1&&jsx("div",{className:"fk:absolute fk:left-[5px] fk:top-4 fk:h-full fk:w-px fk:bg-border"}),jsx("div",{className:`fk:mt-1 fk:size-[11px] fk:shrink-0 fk:rounded-full fk:border-2 ${Oe[t.status??"upcoming"]} fk:corner-squircle`}),jsxs("div",{className:"fk:min-w-0",children:[jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-baseline fk:gap-x-2",children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:t.title}),t.date&&jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:t.date})]}),t.description&&jsx("div",{className:"fk:text-sm fk:text-muted-foreground",children:t.description})]})]},n))}),c=["#6366f1","#10b981","#f59e0b","#ef4444","#06b6d4"],b={background:"hsl(var(--background))",border:"1px solid hsl(var(--border))",borderRadius:6,color:"hsl(var(--foreground))",fontSize:12},v={color:"hsl(var(--foreground))"},y={color:"hsl(var(--foreground))"},u={fill:"hsl(var(--muted-foreground))",fontSize:11};function g(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:0}function X(e){let t=e.data??[];if(!e.aggregate)return t.map(s=>({x:String(s[e.xKey]??""),y:g(s[e.yKey])}));let n=new Map;for(let s of t){let a=String(s[e.xKey]??""),i=n.get(a)??{count:0,sum:0};i.count+=1,i.sum+=g(s[e.yKey]),n.set(a,i);}return Array.from(n.entries()).map(([s,a])=>e.aggregate==="count"?{x:s,y:a.count}:e.aggregate==="avg"?{x:s,y:a.count===0?0:a.sum/a.count}:{x:s,y:a.sum})}function x({children:e,height:t,title:n}){return jsxs("div",{className:"fk:w-full",children:[n&&jsx("div",{className:"fk:mb-2 fk:text-sm fk:font-medium",children:n}),jsx("div",{style:{height:t??256},children:jsx(ResponsiveContainer,{height:"100%",width:"100%",children:e})})]})}var We=({element:e})=>{let t=X(e.props),n=e.props.color??c[0];return jsx(x,{height:e.props.height,title:e.props.title,children:jsxs(BarChart,{data:t,children:[jsx(CartesianGrid,{stroke:"hsl(var(--border))",vertical:false}),jsx(XAxis,{axisLine:false,dataKey:"x",tick:u,tickLine:false,tickMargin:8}),jsx(YAxis,{axisLine:false,tick:u,tickLine:false,width:40}),jsx(Tooltip,{contentStyle:b,cursor:{fill:"hsl(var(--muted))"},itemStyle:v,labelStyle:y}),jsx(Bar,{dataKey:"y",fill:n,isAnimationActive:false,name:e.props.yKey,radius:4})]})})},_e=({element:e})=>{let t=X(e.props),n=e.props.color??c[0];return jsx(x,{height:e.props.height,title:e.props.title,children:jsxs(LineChart,{data:t,children:[jsx(CartesianGrid,{stroke:"hsl(var(--border))",vertical:false}),jsx(XAxis,{axisLine:false,dataKey:"x",tick:u,tickLine:false,tickMargin:8}),jsx(YAxis,{axisLine:false,tick:u,tickLine:false,width:40}),jsx(Tooltip,{contentStyle:b,itemStyle:v,labelStyle:y}),jsx(Line,{dataKey:"y",dot:false,isAnimationActive:false,name:e.props.yKey,stroke:n,strokeWidth:2,type:"monotone"})]})})},Ve=({element:e})=>{let t=(e.props.data??[]).map(n=>({name:String(n[e.props.nameKey]??""),value:g(n[e.props.valueKey])}));return jsx(x,{height:e.props.height,title:e.props.title,children:jsxs(PieChart,{children:[jsx(Tooltip,{contentStyle:b,itemStyle:v,labelStyle:y}),jsx(Pie,{data:t,dataKey:"value",innerRadius:"45%",isAnimationActive:false,nameKey:"name",children:t.map((n,s)=>jsx(Cell,{fill:c[s%c.length]},`${n.name}-${s.toString()}`))})]})})},De=({element:e})=>{let{chart:t$1,title:n}=e.props,s=useId().replace(/[^a-zA-Z0-9]/g,""),[a,i]=useState(null),[l,f]=useState(null);return useEffect(()=>{let k=false;return (async()=>{try{let{default:d}=await import('mermaid'),F=document.documentElement.classList.contains("dark");d.initialize({securityLevel:"strict",startOnLoad:!1,theme:F?"dark":"default"});let O=await d.render(`fk-mermaid-${s}`,t$1);k||(i(O.svg),f(null));}catch(d){k||f(d instanceof Error?d.message:"Failed to render the diagram.");}})(),()=>{k=true;}},[t$1,s]),jsxs("div",{className:"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle",children:[n&&jsx("div",{className:"fk:mb-2 fk:text-sm fk:font-medium",children:n}),l?jsx("pre",{className:"fk:overflow-x-auto fk:whitespace-pre-wrap fk:text-xs fk:text-muted-foreground",children:t$1}):null,!l&&a?jsx("div",{className:"fk:flex fk:justify-center fk:overflow-x-auto",dangerouslySetInnerHTML:{__html:a}}):null,!l&&!a?jsx(t,{className:"fk:h-40 fk:w-full"}):null]})},Ue={Accordion:Ie,Alert:Ae,Badge:Te,BarChart:We,Callout:Fe,Card:pe,Grid:xe,Heading:we,Image:$e,LineChart:_e,Link:Me,Mermaid:De,Metric:He,PieChart:Ve,Progress:ze,Separator:Ce,Skeleton:Ke,Stack:be,TabContent:qe,Table:Le,Tabs:Ee,Text:Se,Timeline:Ge},Ye=({element:e})=>jsxs("div",{className:"fk:rounded-md fk:border fk:border-dashed fk:border-border fk:p-3 fk:text-sm fk:text-muted-foreground fk:corner-squircle",children:["Unsupported component: ",e.type]});function Ze(e,t){let n=new Set,s=[];for(let a of e??[]){let i=String(a);n.has(i)||!t[i]||(n.add(i),s.push(i));}return s}function Qe(e,t){return e.length!==t.length?true:t.some((n,s)=>n!==e[s])}function et(e){if(!e.elements[e.root])return null;let t=false,n={};for(let s of Object.keys(e.elements)){let a=e.elements[s];if(!a)continue;let i=a.children??[],l=Ze(i,e.elements),f=Qe(i,l);f&&(t=true),n[s]=f?{...a,children:l}:a;}return t?{...e,elements:n}:e}var tt="data-spec";function rt(e){let t=new Set,n=[];for(let s of e){if(s.type!==tt)continue;let a=s.data;if(a&&typeof a=="object"&&"type"in a&&a.type==="patch"&&"patch"in a){let i=JSON.stringify(a.patch);if(t.has(i))continue;t.add(i);}n.push(s);}return n}function ft({parts:e}){let t=useMemo(()=>{let s=buildSpecFromParts(rt(e));return s?et(s):null},[e]),n=useMemo(()=>JSON.stringify(t?.state??{}),[t]);return t?jsx(StateProvider,{initialState:t.state,children:jsx(VisibilityProvider,{children:jsx(ActionProvider,{children:jsx(Renderer,{fallback:Ye,registry:Ue,spec:t})})})},n):null}export{ft as RunSpecPart};//# sourceMappingURL=spec-renderer-ZSIVMKVE.js.map
2
+ //# sourceMappingURL=spec-renderer-ZSIVMKVE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/apps/ai/spec-renderer.tsx"],"names":["cardMaxWidthClasses","Card","children","element","props","maxWidthClass","centeredClass","jsxs","jsx","stackGapClasses","stackAlignClasses","stackJustifyClasses","Stack","directionClass","gapClass","alignClass","justifyClass","gridColumnClasses","gridGapClasses","Grid","columnClass","Separator","headingClasses","Heading","level","textClasses","Text","BadgeComponent","Badge","AlertIcon","type","CheckCircle2Icon","AlertTriangleIcon","XCircleIcon","InfoIcon","Alert","typeClass","Table","columns","rows","row","TableCaption","TableHeader","TableRow","column","index","TableHead","TableBody","rowIndex","cell","cellIndex","TableCell","Progress","max","percent","Skeleton","LinkComponent","ExternalLink","Image","Accordion","item","Tabs","tabs","TabsList","tab","TabsTrigger","TabContent","TabsContent","trendClasses","TrendIcon","trend","TrendingUpIcon","TrendingDownIcon","MinusIcon","Metric","calloutClasses","CalloutIcon","LightbulbIcon","OctagonAlertIcon","Callout","timelineDotClasses","Timeline","items","CHART_COLORS","chartTooltipStyle","chartTooltipItemStyle","chartTooltipLabelStyle","chartTick","toNumber","value","parsed","getChartPoints","data","groups","key","group","x","ChartFrame","height","title","ResponsiveContainer","BarChart","points","color","RechartsBarChart","CartesianGrid","XAxis","YAxis","RechartsTooltip","Bar","LineChart","RechartsLineChart","Line","PieChart","slices","RechartsPieChart","Pie","slice","Cell","Mermaid","chart","diagramId","useId","svg","setSvg","useState","error","setError","useEffect","isCancelled","mermaid","isDark","result","renderError","registry","fallback","getSanitizedChildren","childKeys","elements","seen","childKey","normalizedKey","haveChildrenChanged","original","sanitized","sanitizeSpec","spec","hasChanged","elementKey","elementChildren","hasChildrenChanged","SPEC_DATA_PART_TYPE","dedupeSpecParts","parts","seenPatchLines","deduped","part","payload","line","RunSpecPart","useMemo","builtSpec","buildSpecFromParts","stateKey","StateProvider","VisibilityProvider","ActionProvider","Renderer"],"mappings":"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","file":"spec-renderer-3GAVSV52.js","sourcesContent":["import type { JSX } from 'react';\nimport type { ComponentRegistry, ComponentRenderer, Spec } from '@json-render/react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport { ActionProvider, Renderer, StateProvider, VisibilityProvider, buildSpecFromParts } from '@json-render/react';\nimport {\n AlertTriangleIcon,\n CheckCircle2Icon,\n InfoIcon,\n LightbulbIcon,\n MinusIcon,\n OctagonAlertIcon,\n TrendingDownIcon,\n TrendingUpIcon,\n XCircleIcon,\n} from 'lucide-react';\nimport {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Cell,\n Line,\n LineChart as RechartsLineChart,\n Pie,\n PieChart as RechartsPieChart,\n ResponsiveContainer,\n Tooltip as RechartsTooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport {\n Badge,\n ExternalLink,\n Separator as SeparatorPrimitive,\n Skeleton as SkeletonPrimitive,\n Table as TablePrimitive,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs as TabsPrimitive,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '../../ui';\n\n// ---------------------------------------------------------------------------\n// Layout components\n// ---------------------------------------------------------------------------\n\ninterface CardProps {\n centered: boolean | null;\n className: string | null;\n description: string | null;\n maxWidth: 'sm' | 'md' | 'lg' | 'full' | null;\n title: string | null;\n}\n\nconst cardMaxWidthClasses = {\n sm: 'fk:max-w-sm',\n md: 'fk:max-w-md',\n lg: 'fk:max-w-lg',\n full: 'fk:max-w-full',\n};\n\nconst Card: ComponentRenderer<CardProps> = ({ children, element }) => {\n const { props } = element;\n const maxWidthClass = props.maxWidth ? cardMaxWidthClasses[props.maxWidth] : '';\n const centeredClass = props.centered ? 'fk:mx-auto' : '';\n\n return (\n <div\n className={`fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:gap-2 fk:flex fk:flex-col ${maxWidthClass} ${centeredClass} ${props.className ?? ''} fk:corner-squircle`}\n >\n {props.title && <div className=\"fk:text-sm fk:font-medium\">{props.title}</div>}\n {props.description && <div className=\"fk:mt-0.5 fk:text-xs fk:text-muted-foreground\">{props.description}</div>}\n {(props.title ?? props.description) && children ? <div className=\"fk:mt-3\" /> : null}\n {children}\n </div>\n );\n};\n\ninterface StackProps {\n align: 'start' | 'center' | 'end' | 'stretch' | null;\n className: string | null;\n direction: 'horizontal' | 'vertical' | null;\n gap: 'none' | 'sm' | 'md' | 'lg' | 'xl' | null;\n justify: 'start' | 'center' | 'end' | 'between' | 'around' | null;\n}\n\nconst stackGapClasses = {\n none: 'fk:gap-0',\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst stackAlignClasses = {\n start: 'fk:items-start',\n center: 'fk:items-center',\n end: 'fk:items-end',\n stretch: 'fk:items-stretch',\n};\n\nconst stackJustifyClasses = {\n start: 'fk:justify-start',\n center: 'fk:justify-center',\n end: 'fk:justify-end',\n between: 'fk:justify-between',\n around: 'fk:justify-around',\n};\n\nconst Stack: ComponentRenderer<StackProps> = ({ children, element }) => {\n const { props } = element;\n const directionClass = props.direction === 'horizontal' ? 'fk:flex-row fk:flex-wrap' : 'fk:flex-col';\n const gapClass = stackGapClasses[props.gap ?? 'md'];\n const alignClass = props.align ? stackAlignClasses[props.align] : '';\n const justifyClass = props.justify ? stackJustifyClasses[props.justify] : '';\n\n return (\n <div\n className={`fk:flex fk:w-full ${directionClass} ${gapClass} ${alignClass} ${justifyClass} ${props.className ?? ''}`}\n >\n {children}\n </div>\n );\n};\n\ninterface GridProps {\n className: string | null;\n columns: number | null;\n gap: 'sm' | 'md' | 'lg' | 'xl' | null;\n}\n\nconst gridColumnClasses: { [columns: number]: string } = {\n 1: 'fk:grid-cols-1',\n 2: 'fk:grid-cols-2',\n 3: 'fk:grid-cols-3',\n 4: 'fk:grid-cols-4',\n 5: 'fk:grid-cols-5',\n 6: 'fk:grid-cols-6',\n};\n\nconst gridGapClasses = {\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst Grid: ComponentRenderer<GridProps> = ({ children, element }) => {\n const { props } = element;\n const columnClass = gridColumnClasses[props.columns ?? 1] ?? 'fk:grid-cols-1';\n const gapClass = gridGapClasses[props.gap ?? 'md'];\n\n return <div className={`fk:grid fk:w-full ${columnClass} ${gapClass} ${props.className ?? ''}`}>{children}</div>;\n};\n\nconst Separator: ComponentRenderer<{ orientation: 'horizontal' | 'vertical' | null }> = ({ element }) => (\n <SeparatorPrimitive orientation={element.props.orientation ?? 'horizontal'} />\n);\n\n// ---------------------------------------------------------------------------\n// Typography and content components\n// ---------------------------------------------------------------------------\n\ninterface HeadingProps {\n level: 'h1' | 'h2' | 'h3' | 'h4' | null;\n text: string;\n}\n\nconst headingClasses = {\n h1: 'fk:text-xl fk:font-semibold fk:tracking-tight',\n h2: 'fk:text-lg fk:font-semibold fk:tracking-tight',\n h3: 'fk:text-base fk:font-medium',\n h4: 'fk:text-sm fk:font-medium',\n};\n\nconst Heading: ComponentRenderer<HeadingProps> = ({ element }) => {\n const level = element.props.level ?? 'h2';\n const HeadingTag = level;\n\n return <HeadingTag className={headingClasses[level]}>{element.props.text}</HeadingTag>;\n};\n\ninterface TextProps {\n text: string;\n variant: 'body' | 'muted' | 'caption' | 'lead' | 'code' | null;\n}\n\nconst textClasses = {\n body: 'fk:text-sm',\n muted: 'fk:text-sm fk:text-muted-foreground',\n caption: 'fk:text-xs fk:text-muted-foreground',\n lead: 'fk:text-base',\n code: 'fk:rounded fk:bg-muted fk:px-1 fk:py-0.5 fk:font-mono fk:text-xs fk:corner-squircle',\n};\n\nconst Text: ComponentRenderer<TextProps> = ({ element }) => (\n <p className={textClasses[element.props.variant ?? 'body']}>{element.props.text}</p>\n);\n\ninterface BadgeProps {\n text: string;\n variant: 'default' | 'secondary' | 'destructive' | 'outline' | null;\n}\n\nconst BadgeComponent: ComponentRenderer<BadgeProps> = ({ element }) => (\n <Badge variant={element.props.variant ?? 'default'}>{element.props.text}</Badge>\n);\n\ninterface AlertProps {\n message: string | null;\n title: string;\n type: 'success' | 'info' | 'warning' | 'error' | null;\n}\n\nfunction AlertIcon({ type }: { type: AlertProps['type'] }): JSX.Element {\n switch (type) {\n case 'success':\n return <CheckCircle2Icon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'error':\n return <XCircleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n }\n}\n\nconst Alert: ComponentRenderer<AlertProps> = ({ element }) => {\n const { props } = element;\n const typeClass = props.type === 'error' ? 'fk:border-destructive/50 fk:text-destructive' : 'fk:text-foreground';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:bg-card fk:px-4 fk:py-3 fk:text-sm ${typeClass} fk:corner-squircle`}\n role=\"alert\"\n >\n <AlertIcon type={props.type} />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:font-medium\">{props.title}</div>\n {props.message && <div className=\"fk:text-muted-foreground\">{props.message}</div>}\n </div>\n </div>\n );\n};\n\ninterface TableProps {\n caption: string | null;\n columns: string[];\n rows: string[][];\n}\n\nconst Table: ComponentRenderer<TableProps> = ({ element }) => {\n const columns = element.props.columns ?? [];\n const rows = (element.props.rows ?? []).map((row) => row.map(String));\n\n return (\n <div className=\"fk:w-full fk:overflow-hidden fk:rounded-md fk:mt-2 fk:corner-squircle\">\n <TablePrimitive>\n {element.props.caption && <TableCaption>{element.props.caption}</TableCaption>}\n <TableHeader>\n <TableRow>\n {columns.map((column, index) => (\n <TableHead key={`${index.toString()}-${column}`}>{column}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <TableCell key={cellIndex}>{cell}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </TablePrimitive>\n </div>\n );\n};\n\ninterface ProgressProps {\n label: string | null;\n max: number | null;\n value: number;\n}\n\nconst Progress: ComponentRenderer<ProgressProps> = ({ element }) => {\n const { props } = element;\n const max = props.max ?? 100;\n const percent = max > 0 ? Math.min(100, Math.max(0, (props.value / max) * 100)) : 0;\n\n return (\n <div className=\"fk:w-full\">\n {props.label && (\n <div className=\"fk:mb-1 fk:flex fk:items-center fk:justify-between fk:text-xs fk:text-muted-foreground\">\n <span>{props.label}</span>\n <span className=\"fk:tabular-nums\">{Math.round(percent)}%</span>\n </div>\n )}\n <div className=\"fk:h-2 fk:w-full fk:overflow-hidden fk:rounded-full fk:bg-secondary fk:corner-squircle\">\n <div className=\"fk:h-full fk:rounded-full fk:bg-primary fk:corner-squircle\" style={{ width: `${percent.toString()}%` }} />\n </div>\n </div>\n );\n};\n\nconst Skeleton: ComponentRenderer<{ height: string | null; rounded: boolean | null; width: string | null }> = ({\n element,\n}) => (\n <SkeletonPrimitive\n className={element.props.rounded ? 'fk:rounded-full fk:corner-squircle' : ''}\n style={{ height: element.props.height ?? '1rem', width: element.props.width ?? '100%' }}\n />\n);\n\nconst LinkComponent: ComponentRenderer<{ href: string; label: string }> = ({ element }) => (\n <ExternalLink href={element.props.href}>{element.props.label}</ExternalLink>\n);\n\nconst Image: ComponentRenderer<{\n alt: string;\n height: number | null;\n src: string | null;\n width: number | null;\n}> = ({ element }) => {\n if (!element.props.src) {\n return null;\n }\n\n return (\n <img\n alt={element.props.alt}\n className=\"fk:max-w-full fk:rounded-md fk:corner-squircle\"\n height={element.props.height ?? undefined}\n src={element.props.src}\n width={element.props.width ?? undefined}\n />\n );\n};\n\ninterface AccordionProps {\n items: { content: string; title: string }[];\n type: 'single' | 'multiple' | null;\n}\n\nconst Accordion: ComponentRenderer<AccordionProps> = ({ element }) => (\n <div className=\"fk:w-full fk:divide-y fk:divide-border fk:rounded-md fk:border fk:border-border fk:corner-squircle\">\n {(element.props.items ?? []).map((item, index) => (\n <details className=\"fk:group fk:px-4 fk:py-3\" key={index}>\n <summary className=\"fk:cursor-pointer fk:list-none fk:text-sm fk:font-medium\">{item.title}</summary>\n <p className=\"fk:mt-2 fk:text-sm fk:text-muted-foreground\">{item.content}</p>\n </details>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\ninterface TabsProps {\n defaultValue: string | null;\n tabs: { label: string; value: string }[];\n value: string | null;\n}\n\nconst Tabs: ComponentRenderer<TabsProps> = ({ children, element }) => {\n const tabs = element.props.tabs ?? [];\n\n return (\n <TabsPrimitive defaultValue={element.props.value ?? element.props.defaultValue ?? tabs[0]?.value}>\n <TabsList>\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {children}\n </TabsPrimitive>\n );\n};\n\nconst TabContent: ComponentRenderer<{ value: string }> = ({ children, element }) => (\n <TabsContent value={element.props.value}>{children}</TabsContent>\n);\n\n// ---------------------------------------------------------------------------\n// Result-focused components (Metric, Callout, Timeline)\n// ---------------------------------------------------------------------------\n\ninterface MetricProps {\n detail: string | null;\n label: string;\n trend: 'up' | 'down' | 'neutral' | null;\n value: string;\n}\n\nconst trendClasses = {\n up: 'fk:text-success',\n down: 'fk:text-destructive',\n neutral: 'fk:text-muted-foreground',\n};\n\nfunction TrendIcon({ trend }: { trend: 'up' | 'down' | 'neutral' }): JSX.Element {\n if (trend === 'up') {\n return <TrendingUpIcon className=\"fk:size-4\" />;\n }\n\n if (trend === 'down') {\n return <TrendingDownIcon className=\"fk:size-4\" />;\n }\n\n return <MinusIcon className=\"fk:size-4\" />;\n}\n\nconst Metric: ComponentRenderer<MetricProps> = ({ element }) => {\n const { props } = element;\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle\">\n <div className=\"fk:text-xs fk:font-medium fk:text-muted-foreground\">{props.label}</div>\n <div className=\"fk:mt-1 fk:flex fk:items-center fk:gap-2\">\n <span className=\"fk:text-2xl fk:font-semibold fk:tabular-nums fk:tracking-tight\">{props.value}</span>\n {props.trend && (\n <span className={trendClasses[props.trend]}>\n <TrendIcon trend={props.trend} />\n </span>\n )}\n </div>\n {props.detail && <div className=\"fk:mt-1 fk:text-xs fk:text-muted-foreground\">{props.detail}</div>}\n </div>\n );\n};\n\ninterface CalloutProps {\n content: string;\n title: string | null;\n type: 'info' | 'tip' | 'warning' | 'important' | null;\n}\n\nconst calloutClasses = {\n info: 'fk:border-blue-500/30 fk:bg-blue-500/5 fk:text-blue-700 fk:dark:text-blue-400',\n tip: 'fk:border-emerald-500/30 fk:bg-emerald-500/5 fk:text-emerald-700 fk:dark:text-emerald-400',\n warning: 'fk:border-amber-500/30 fk:bg-amber-500/5 fk:text-amber-700 fk:dark:text-amber-400',\n important: 'fk:border-red-500/30 fk:bg-red-500/5 fk:text-red-700 fk:dark:text-red-400',\n};\n\nfunction CalloutIcon({ type }: { type: 'info' | 'tip' | 'warning' | 'important' }): JSX.Element {\n switch (type) {\n case 'tip':\n return <LightbulbIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'important':\n return <OctagonAlertIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n }\n}\n\nconst Callout: ComponentRenderer<CalloutProps> = ({ element }) => {\n const { props } = element;\n const type = props.type ?? 'info';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:px-4 fk:py-3 fk:text-sm ${calloutClasses[type]} fk:corner-squircle`}\n >\n <CalloutIcon type={type} />\n <div className=\"fk:min-w-0\">\n {props.title && <div className=\"fk:font-medium\">{props.title}</div>}\n <div className=\"fk:text-foreground\">{props.content}</div>\n </div>\n </div>\n );\n};\n\ninterface TimelineProps {\n items: {\n date: string | null;\n description: string | null;\n status: 'completed' | 'current' | 'upcoming' | null;\n title: string;\n }[];\n}\n\nconst timelineDotClasses = {\n completed: 'fk:border-success fk:bg-success',\n current: 'fk:border-primary fk:bg-primary',\n upcoming: 'fk:border-border fk:bg-background',\n};\n\nconst Timeline: ComponentRenderer<TimelineProps> = ({ element }) => (\n <div className=\"fk:w-full\">\n {(element.props.items ?? []).map((item, index, items) => (\n <div className=\"fk:relative fk:flex fk:gap-3 fk:pb-4 fk:last:pb-0\" key={index}>\n {index < items.length - 1 && (\n <div className=\"fk:absolute fk:left-[5px] fk:top-4 fk:h-full fk:w-px fk:bg-border\" />\n )}\n <div\n className={`fk:mt-1 fk:size-[11px] fk:shrink-0 fk:rounded-full fk:border-2 ${timelineDotClasses[item.status ?? 'upcoming']} fk:corner-squircle`}\n />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:flex fk:flex-wrap fk:items-baseline fk:gap-x-2\">\n <span className=\"fk:text-sm fk:font-medium\">{item.title}</span>\n {item.date && <span className=\"fk:text-xs fk:text-muted-foreground\">{item.date}</span>}\n </div>\n {item.description && <div className=\"fk:text-sm fk:text-muted-foreground\">{item.description}</div>}\n </div>\n </div>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Charts\n// ---------------------------------------------------------------------------\n\nconst CHART_COLORS = ['#6366f1', '#10b981', '#f59e0b', '#ef4444', '#06b6d4'];\n\nconst chartTooltipStyle = {\n background: 'hsl(var(--background))',\n border: '1px solid hsl(var(--border))',\n borderRadius: 6,\n color: 'hsl(var(--foreground))',\n fontSize: 12,\n};\n\nconst chartTooltipItemStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTooltipLabelStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTick = { fill: 'hsl(var(--muted-foreground))', fontSize: 11 };\n\ninterface ChartPoint {\n x: string;\n y: number;\n}\n\ninterface CartesianChartProps {\n aggregate: 'sum' | 'count' | 'avg' | null;\n color: string | null;\n data: { [key: string]: unknown }[];\n height: number | null;\n title: string | null;\n xKey: string;\n yKey: string;\n}\n\nfunction toNumber(value: unknown): number {\n const parsed = typeof value === 'number' ? value : Number(value);\n\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction getChartPoints(props: CartesianChartProps): ChartPoint[] {\n const data = props.data ?? [];\n\n if (!props.aggregate) {\n return data.map((row) => ({\n x: String(row[props.xKey] ?? ''),\n y: toNumber(row[props.yKey]),\n }));\n }\n\n const groups = new Map<string, { count: number; sum: number }>();\n\n for (const row of data) {\n const key = String(row[props.xKey] ?? '');\n const group = groups.get(key) ?? { count: 0, sum: 0 };\n\n group.count += 1;\n group.sum += toNumber(row[props.yKey]);\n groups.set(key, group);\n }\n\n return Array.from(groups.entries()).map(([x, group]) => {\n if (props.aggregate === 'count') {\n return { x, y: group.count };\n }\n\n if (props.aggregate === 'avg') {\n return { x, y: group.count === 0 ? 0 : group.sum / group.count };\n }\n\n return { x, y: group.sum };\n });\n}\n\nfunction ChartFrame({\n children,\n height,\n title,\n}: {\n children: JSX.Element;\n height: number | null;\n title: string | null;\n}): JSX.Element {\n return (\n <div className=\"fk:w-full\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n <div style={{ height: height ?? 256 }}>\n <ResponsiveContainer height=\"100%\" width=\"100%\">\n {children}\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nconst BarChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsBarChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n cursor={{ fill: 'hsl(var(--muted))' }}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Bar dataKey=\"y\" fill={color} isAnimationActive={false} name={element.props.yKey} radius={4} />\n </RechartsBarChart>\n </ChartFrame>\n );\n};\n\nconst LineChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsLineChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Line\n dataKey=\"y\"\n dot={false}\n isAnimationActive={false}\n name={element.props.yKey}\n stroke={color}\n strokeWidth={2}\n type=\"monotone\"\n />\n </RechartsLineChart>\n </ChartFrame>\n );\n};\n\ninterface PieChartProps {\n data: { [key: string]: unknown }[];\n height: number | null;\n nameKey: string;\n title: string | null;\n valueKey: string;\n}\n\nconst PieChart: ComponentRenderer<PieChartProps> = ({ element }) => {\n const slices = (element.props.data ?? []).map((row) => ({\n name: String(row[element.props.nameKey] ?? ''),\n value: toNumber(row[element.props.valueKey]),\n }));\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsPieChart>\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Pie data={slices} dataKey=\"value\" innerRadius=\"45%\" isAnimationActive={false} nameKey=\"name\">\n {slices.map((slice, index) => (\n <Cell fill={CHART_COLORS[index % CHART_COLORS.length]} key={`${slice.name}-${index.toString()}`} />\n ))}\n </Pie>\n </RechartsPieChart>\n </ChartFrame>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Mermaid\n// ---------------------------------------------------------------------------\n\ninterface MermaidProps {\n chart: string;\n title: string | null;\n}\n\nconst Mermaid: ComponentRenderer<MermaidProps> = ({ element }) => {\n const { chart, title } = element.props;\n const diagramId = useId().replace(/[^a-zA-Z0-9]/g, '');\n const [svg, setSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n const render = async (): Promise<void> => {\n try {\n const { default: mermaid } = await import('mermaid');\n const isDark = document.documentElement.classList.contains('dark');\n\n mermaid.initialize({ securityLevel: 'strict', startOnLoad: false, theme: isDark ? 'dark' : 'default' });\n\n const result = await mermaid.render(`fk-mermaid-${diagramId}`, chart);\n\n if (!isCancelled) {\n setSvg(result.svg);\n setError(null);\n }\n } catch (renderError) {\n if (!isCancelled) {\n setError(renderError instanceof Error ? renderError.message : 'Failed to render the diagram.');\n }\n }\n };\n\n void render();\n\n return () => {\n isCancelled = true;\n };\n }, [chart, diagramId]);\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n {error ? (\n <pre className=\"fk:overflow-x-auto fk:whitespace-pre-wrap fk:text-xs fk:text-muted-foreground\">{chart}</pre>\n ) : null}\n {!error && svg ? (\n <div className=\"fk:flex fk:justify-center fk:overflow-x-auto\" dangerouslySetInnerHTML={{ __html: svg }} />\n ) : null}\n {!error && !svg ? <SkeletonPrimitive className=\"fk:h-40 fk:w-full\" /> : null}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Registry and spec rendering\n// ---------------------------------------------------------------------------\n\nconst registry: ComponentRegistry = {\n Accordion,\n Alert,\n Badge: BadgeComponent,\n BarChart,\n Callout,\n Card,\n Grid,\n Heading,\n Image,\n LineChart,\n Link: LinkComponent,\n Mermaid,\n Metric,\n PieChart,\n Progress,\n Separator,\n Skeleton,\n Stack,\n TabContent,\n Table,\n Tabs,\n Text,\n Timeline,\n};\n\nconst fallback: ComponentRenderer = ({ element }) => (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:border-border fk:p-3 fk:text-sm fk:text-muted-foreground fk:corner-squircle\">\n Unsupported component: {element.type}\n </div>\n);\n\nfunction getSanitizedChildren(childKeys: string[] | undefined, elements: Spec['elements']): string[] {\n const seen = new Set<string>();\n const children: string[] = [];\n\n for (const childKey of childKeys ?? []) {\n const normalizedKey = String(childKey);\n\n if (seen.has(normalizedKey) || !elements[normalizedKey]) {\n continue;\n }\n\n seen.add(normalizedKey);\n children.push(normalizedKey);\n }\n\n return children;\n}\n\nfunction haveChildrenChanged(original: string[], sanitized: string[]): boolean {\n if (original.length !== sanitized.length) {\n return true;\n }\n\n return sanitized.some((childKey, index) => childKey !== original[index]);\n}\n\nfunction sanitizeSpec(spec: Spec): Spec | null {\n if (!spec.elements[spec.root]) {\n return null;\n }\n\n let hasChanged = false;\n const elements: Spec['elements'] = {};\n\n for (const elementKey of Object.keys(spec.elements)) {\n const element = spec.elements[elementKey];\n\n if (!element) {\n continue;\n }\n\n const elementChildren = element.children ?? [];\n const children = getSanitizedChildren(elementChildren, spec.elements);\n const hasChildrenChanged = haveChildrenChanged(elementChildren, children);\n\n if (hasChildrenChanged) {\n hasChanged = true;\n }\n\n elements[elementKey] = hasChildrenChanged ? { ...element, children } : element;\n }\n\n if (!hasChanged) {\n return spec;\n }\n\n return { ...spec, elements };\n}\n\ninterface SpecMessagePart {\n data?: unknown;\n text?: string;\n type: string;\n}\n\nconst SPEC_DATA_PART_TYPE = 'data-spec';\n\nfunction dedupeSpecParts(parts: SpecMessagePart[]): SpecMessagePart[] {\n const seenPatchLines = new Set<string>();\n const deduped: SpecMessagePart[] = [];\n\n for (const part of parts) {\n if (part.type !== SPEC_DATA_PART_TYPE) {\n continue;\n }\n\n const payload = part.data;\n\n if (payload && typeof payload === 'object' && 'type' in payload && payload.type === 'patch' && 'patch' in payload) {\n const line = JSON.stringify(payload.patch);\n\n if (seenPatchLines.has(line)) {\n continue;\n }\n\n seenPatchLines.add(line);\n }\n\n deduped.push(part);\n }\n\n return deduped;\n}\n\nexport function RunSpecPart({ parts }: { parts: SpecMessagePart[] }): JSX.Element | null {\n const spec = useMemo(() => {\n const builtSpec = buildSpecFromParts(dedupeSpecParts(parts));\n\n return builtSpec ? sanitizeSpec(builtSpec) : null;\n }, [parts]);\n const stateKey = useMemo(() => JSON.stringify(spec?.state ?? {}), [spec]);\n\n if (!spec) {\n return null;\n }\n\n return (\n <StateProvider initialState={spec.state} key={stateKey}>\n <VisibilityProvider>\n <ActionProvider>\n <Renderer fallback={fallback} registry={registry} spec={spec} />\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\nexport type { SpecMessagePart };\n"]}
1
+ {"version":3,"sources":["../src/apps/ai/spec-renderer.tsx"],"names":["cardMaxWidthClasses","Card","children","element","props","maxWidthClass","centeredClass","jsxs","jsx","stackGapClasses","stackAlignClasses","stackJustifyClasses","Stack","directionClass","gapClass","alignClass","justifyClass","gridColumnClasses","gridGapClasses","Grid","columnClass","Separator","headingClasses","Heading","level","textClasses","Text","BadgeComponent","Badge","AlertIcon","type","CheckCircle2Icon","AlertTriangleIcon","XCircleIcon","InfoIcon","Alert","typeClass","Table","columns","rows","row","TableCaption","TableHeader","TableRow","column","index","TableHead","TableBody","rowIndex","cell","cellIndex","TableCell","Progress","max","percent","Skeleton","LinkComponent","ExternalLink","Image","Accordion","item","Tabs","tabs","TabsList","tab","TabsTrigger","TabContent","TabsContent","trendClasses","TrendIcon","trend","TrendingUpIcon","TrendingDownIcon","MinusIcon","Metric","calloutClasses","CalloutIcon","LightbulbIcon","OctagonAlertIcon","Callout","timelineDotClasses","Timeline","items","CHART_COLORS","chartTooltipStyle","chartTooltipItemStyle","chartTooltipLabelStyle","chartTick","toNumber","value","parsed","getChartPoints","data","groups","key","group","x","ChartFrame","height","title","ResponsiveContainer","BarChart","points","color","RechartsBarChart","CartesianGrid","XAxis","YAxis","RechartsTooltip","Bar","LineChart","RechartsLineChart","Line","PieChart","slices","RechartsPieChart","Pie","slice","Cell","Mermaid","chart","diagramId","useId","svg","setSvg","useState","error","setError","useEffect","isCancelled","mermaid","isDark","result","renderError","registry","fallback","getSanitizedChildren","childKeys","elements","seen","childKey","normalizedKey","haveChildrenChanged","original","sanitized","sanitizeSpec","spec","hasChanged","elementKey","elementChildren","hasChildrenChanged","SPEC_DATA_PART_TYPE","dedupeSpecParts","parts","seenPatchLines","deduped","part","payload","line","RunSpecPart","useMemo","builtSpec","buildSpecFromParts","stateKey","StateProvider","VisibilityProvider","ActionProvider","Renderer"],"mappings":"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","file":"spec-renderer-ZSIVMKVE.js","sourcesContent":["import type { JSX } from 'react';\nimport type { ComponentRegistry, ComponentRenderer, Spec } from '@json-render/react';\nimport { useEffect, useId, useMemo, useState } from 'react';\nimport { ActionProvider, Renderer, StateProvider, VisibilityProvider, buildSpecFromParts } from '@json-render/react';\nimport {\n AlertTriangleIcon,\n CheckCircle2Icon,\n InfoIcon,\n LightbulbIcon,\n MinusIcon,\n OctagonAlertIcon,\n TrendingDownIcon,\n TrendingUpIcon,\n XCircleIcon,\n} from 'lucide-react';\nimport {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Cell,\n Line,\n LineChart as RechartsLineChart,\n Pie,\n PieChart as RechartsPieChart,\n ResponsiveContainer,\n Tooltip as RechartsTooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport {\n Badge,\n ExternalLink,\n Separator as SeparatorPrimitive,\n Skeleton as SkeletonPrimitive,\n Table as TablePrimitive,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs as TabsPrimitive,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '../../ui';\n\n// ---------------------------------------------------------------------------\n// Layout components\n// ---------------------------------------------------------------------------\n\ninterface CardProps {\n centered: boolean | null;\n className: string | null;\n description: string | null;\n maxWidth: 'sm' | 'md' | 'lg' | 'full' | null;\n title: string | null;\n}\n\nconst cardMaxWidthClasses = {\n sm: 'fk:max-w-sm',\n md: 'fk:max-w-md',\n lg: 'fk:max-w-lg',\n full: 'fk:max-w-full',\n};\n\nconst Card: ComponentRenderer<CardProps> = ({ children, element }) => {\n const { props } = element;\n const maxWidthClass = props.maxWidth ? cardMaxWidthClasses[props.maxWidth] : '';\n const centeredClass = props.centered ? 'fk:mx-auto' : '';\n\n return (\n <div\n className={`fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:gap-2 fk:flex fk:flex-col ${maxWidthClass} ${centeredClass} ${props.className ?? ''} fk:corner-squircle`}\n >\n {props.title && <div className=\"fk:text-sm fk:font-medium\">{props.title}</div>}\n {props.description && <div className=\"fk:mt-0.5 fk:text-xs fk:text-muted-foreground\">{props.description}</div>}\n {(props.title ?? props.description) && children ? <div className=\"fk:mt-3\" /> : null}\n {children}\n </div>\n );\n};\n\ninterface StackProps {\n align: 'start' | 'center' | 'end' | 'stretch' | null;\n className: string | null;\n direction: 'horizontal' | 'vertical' | null;\n gap: 'none' | 'sm' | 'md' | 'lg' | 'xl' | null;\n justify: 'start' | 'center' | 'end' | 'between' | 'around' | null;\n}\n\nconst stackGapClasses = {\n none: 'fk:gap-0',\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst stackAlignClasses = {\n start: 'fk:items-start',\n center: 'fk:items-center',\n end: 'fk:items-end',\n stretch: 'fk:items-stretch',\n};\n\nconst stackJustifyClasses = {\n start: 'fk:justify-start',\n center: 'fk:justify-center',\n end: 'fk:justify-end',\n between: 'fk:justify-between',\n around: 'fk:justify-around',\n};\n\nconst Stack: ComponentRenderer<StackProps> = ({ children, element }) => {\n const { props } = element;\n const directionClass = props.direction === 'horizontal' ? 'fk:flex-row fk:flex-wrap' : 'fk:flex-col';\n const gapClass = stackGapClasses[props.gap ?? 'md'];\n const alignClass = props.align ? stackAlignClasses[props.align] : '';\n const justifyClass = props.justify ? stackJustifyClasses[props.justify] : '';\n\n return (\n <div\n className={`fk:flex fk:w-full ${directionClass} ${gapClass} ${alignClass} ${justifyClass} ${props.className ?? ''}`}\n >\n {children}\n </div>\n );\n};\n\ninterface GridProps {\n className: string | null;\n columns: number | null;\n gap: 'sm' | 'md' | 'lg' | 'xl' | null;\n}\n\nconst gridColumnClasses: { [columns: number]: string } = {\n 1: 'fk:grid-cols-1',\n 2: 'fk:grid-cols-2',\n 3: 'fk:grid-cols-3',\n 4: 'fk:grid-cols-4',\n 5: 'fk:grid-cols-5',\n 6: 'fk:grid-cols-6',\n};\n\nconst gridGapClasses = {\n sm: 'fk:gap-2',\n md: 'fk:gap-3',\n lg: 'fk:gap-4',\n xl: 'fk:gap-6',\n};\n\nconst Grid: ComponentRenderer<GridProps> = ({ children, element }) => {\n const { props } = element;\n const columnClass = gridColumnClasses[props.columns ?? 1] ?? 'fk:grid-cols-1';\n const gapClass = gridGapClasses[props.gap ?? 'md'];\n\n return <div className={`fk:grid fk:w-full ${columnClass} ${gapClass} ${props.className ?? ''}`}>{children}</div>;\n};\n\nconst Separator: ComponentRenderer<{ orientation: 'horizontal' | 'vertical' | null }> = ({ element }) => (\n <SeparatorPrimitive orientation={element.props.orientation ?? 'horizontal'} />\n);\n\n// ---------------------------------------------------------------------------\n// Typography and content components\n// ---------------------------------------------------------------------------\n\ninterface HeadingProps {\n level: 'h1' | 'h2' | 'h3' | 'h4' | null;\n text: string;\n}\n\nconst headingClasses = {\n h1: 'fk:text-xl fk:font-semibold fk:tracking-tight',\n h2: 'fk:text-lg fk:font-semibold fk:tracking-tight',\n h3: 'fk:text-base fk:font-medium',\n h4: 'fk:text-sm fk:font-medium',\n};\n\nconst Heading: ComponentRenderer<HeadingProps> = ({ element }) => {\n const level = element.props.level ?? 'h2';\n const HeadingTag = level;\n\n return <HeadingTag className={headingClasses[level]}>{element.props.text}</HeadingTag>;\n};\n\ninterface TextProps {\n text: string;\n variant: 'body' | 'muted' | 'caption' | 'lead' | 'code' | null;\n}\n\nconst textClasses = {\n body: 'fk:text-sm',\n muted: 'fk:text-sm fk:text-muted-foreground',\n caption: 'fk:text-xs fk:text-muted-foreground',\n lead: 'fk:text-base',\n code: 'fk:rounded fk:bg-muted fk:px-1 fk:py-0.5 fk:font-mono fk:text-xs fk:corner-squircle',\n};\n\nconst Text: ComponentRenderer<TextProps> = ({ element }) => (\n <p className={textClasses[element.props.variant ?? 'body']}>{element.props.text}</p>\n);\n\ninterface BadgeProps {\n text: string;\n variant: 'default' | 'secondary' | 'destructive' | 'outline' | null;\n}\n\nconst BadgeComponent: ComponentRenderer<BadgeProps> = ({ element }) => (\n <Badge variant={element.props.variant ?? 'default'}>{element.props.text}</Badge>\n);\n\ninterface AlertProps {\n message: string | null;\n title: string;\n type: 'success' | 'info' | 'warning' | 'error' | null;\n}\n\nfunction AlertIcon({ type }: { type: AlertProps['type'] }): JSX.Element {\n switch (type) {\n case 'success':\n return <CheckCircle2Icon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n case 'error':\n return <XCircleIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:translate-y-0.5\" />;\n }\n}\n\nconst Alert: ComponentRenderer<AlertProps> = ({ element }) => {\n const { props } = element;\n const typeClass = props.type === 'error' ? 'fk:border-destructive/50 fk:text-destructive' : 'fk:text-foreground';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:bg-card fk:px-4 fk:py-3 fk:text-sm ${typeClass} fk:corner-squircle`}\n role=\"alert\"\n >\n <AlertIcon type={props.type} />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:font-medium\">{props.title}</div>\n {props.message && <div className=\"fk:text-muted-foreground\">{props.message}</div>}\n </div>\n </div>\n );\n};\n\ninterface TableProps {\n caption: string | null;\n columns: string[];\n rows: string[][];\n}\n\nconst Table: ComponentRenderer<TableProps> = ({ element }) => {\n const columns = element.props.columns ?? [];\n const rows = (element.props.rows ?? []).map((row) => row.map(String));\n\n return (\n <div className=\"fk:w-full fk:overflow-hidden fk:rounded-md fk:mt-2 fk:corner-squircle\">\n <TablePrimitive>\n {element.props.caption && <TableCaption>{element.props.caption}</TableCaption>}\n <TableHeader>\n <TableRow>\n {columns.map((column, index) => (\n <TableHead key={`${index.toString()}-${column}`}>{column}</TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row, rowIndex) => (\n <TableRow key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <TableCell key={cellIndex}>{cell}</TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n </TablePrimitive>\n </div>\n );\n};\n\ninterface ProgressProps {\n label: string | null;\n max: number | null;\n value: number;\n}\n\nconst Progress: ComponentRenderer<ProgressProps> = ({ element }) => {\n const { props } = element;\n const max = props.max ?? 100;\n const percent = max > 0 ? Math.min(100, Math.max(0, (props.value / max) * 100)) : 0;\n\n return (\n <div className=\"fk:w-full\">\n {props.label && (\n <div className=\"fk:mb-1 fk:flex fk:items-center fk:justify-between fk:text-xs fk:text-muted-foreground\">\n <span>{props.label}</span>\n <span className=\"fk:tabular-nums\">{Math.round(percent)}%</span>\n </div>\n )}\n <div className=\"fk:h-2 fk:w-full fk:overflow-hidden fk:rounded-full fk:bg-secondary fk:corner-squircle\">\n <div className=\"fk:h-full fk:rounded-full fk:bg-primary fk:corner-squircle\" style={{ width: `${percent.toString()}%` }} />\n </div>\n </div>\n );\n};\n\nconst Skeleton: ComponentRenderer<{ height: string | null; rounded: boolean | null; width: string | null }> = ({\n element,\n}) => (\n <SkeletonPrimitive\n className={element.props.rounded ? 'fk:rounded-full fk:corner-squircle' : ''}\n style={{ height: element.props.height ?? '1rem', width: element.props.width ?? '100%' }}\n />\n);\n\nconst LinkComponent: ComponentRenderer<{ href: string; label: string }> = ({ element }) => (\n <ExternalLink href={element.props.href}>{element.props.label}</ExternalLink>\n);\n\nconst Image: ComponentRenderer<{\n alt: string;\n height: number | null;\n src: string | null;\n width: number | null;\n}> = ({ element }) => {\n if (!element.props.src) {\n return null;\n }\n\n return (\n <img\n alt={element.props.alt}\n className=\"fk:max-w-full fk:rounded-md fk:corner-squircle\"\n height={element.props.height ?? undefined}\n src={element.props.src}\n width={element.props.width ?? undefined}\n />\n );\n};\n\ninterface AccordionProps {\n items: { content: string; title: string }[];\n type: 'single' | 'multiple' | null;\n}\n\nconst Accordion: ComponentRenderer<AccordionProps> = ({ element }) => (\n <div className=\"fk:w-full fk:divide-y fk:divide-border fk:rounded-md fk:border fk:border-border fk:corner-squircle\">\n {(element.props.items ?? []).map((item, index) => (\n <details className=\"fk:group fk:px-4 fk:py-3\" key={index}>\n <summary className=\"fk:cursor-pointer fk:list-none fk:text-sm fk:font-medium\">{item.title}</summary>\n <p className=\"fk:mt-2 fk:text-sm fk:text-muted-foreground\">{item.content}</p>\n </details>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\ninterface TabsProps {\n defaultValue: string | null;\n tabs: { label: string; value: string }[];\n value: string | null;\n}\n\nconst Tabs: ComponentRenderer<TabsProps> = ({ children, element }) => {\n const tabs = element.props.tabs ?? [];\n\n return (\n <TabsPrimitive defaultValue={element.props.value ?? element.props.defaultValue ?? tabs[0]?.value}>\n <TabsList>\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {children}\n </TabsPrimitive>\n );\n};\n\nconst TabContent: ComponentRenderer<{ value: string }> = ({ children, element }) => (\n <TabsContent value={element.props.value}>{children}</TabsContent>\n);\n\n// ---------------------------------------------------------------------------\n// Result-focused components (Metric, Callout, Timeline)\n// ---------------------------------------------------------------------------\n\ninterface MetricProps {\n detail: string | null;\n label: string;\n trend: 'up' | 'down' | 'neutral' | null;\n value: string;\n}\n\nconst trendClasses = {\n up: 'fk:text-success',\n down: 'fk:text-destructive',\n neutral: 'fk:text-muted-foreground',\n};\n\nfunction TrendIcon({ trend }: { trend: 'up' | 'down' | 'neutral' }): JSX.Element {\n if (trend === 'up') {\n return <TrendingUpIcon className=\"fk:size-4\" />;\n }\n\n if (trend === 'down') {\n return <TrendingDownIcon className=\"fk:size-4\" />;\n }\n\n return <MinusIcon className=\"fk:size-4\" />;\n}\n\nconst Metric: ComponentRenderer<MetricProps> = ({ element }) => {\n const { props } = element;\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle\">\n <div className=\"fk:text-xs fk:font-medium fk:text-muted-foreground\">{props.label}</div>\n <div className=\"fk:mt-1 fk:flex fk:items-center fk:gap-2\">\n <span className=\"fk:text-2xl fk:font-semibold fk:tabular-nums fk:tracking-tight\">{props.value}</span>\n {props.trend && (\n <span className={trendClasses[props.trend]}>\n <TrendIcon trend={props.trend} />\n </span>\n )}\n </div>\n {props.detail && <div className=\"fk:mt-1 fk:text-xs fk:text-muted-foreground\">{props.detail}</div>}\n </div>\n );\n};\n\ninterface CalloutProps {\n content: string;\n title: string | null;\n type: 'info' | 'tip' | 'warning' | 'important' | null;\n}\n\nconst calloutClasses = {\n info: 'fk:border-blue-500/30 fk:bg-blue-500/5 fk:text-blue-700 fk:dark:text-blue-400',\n tip: 'fk:border-emerald-500/30 fk:bg-emerald-500/5 fk:text-emerald-700 fk:dark:text-emerald-400',\n warning: 'fk:border-amber-500/30 fk:bg-amber-500/5 fk:text-amber-700 fk:dark:text-amber-400',\n important: 'fk:border-red-500/30 fk:bg-red-500/5 fk:text-red-700 fk:dark:text-red-400',\n};\n\nfunction CalloutIcon({ type }: { type: 'info' | 'tip' | 'warning' | 'important' }): JSX.Element {\n switch (type) {\n case 'tip':\n return <LightbulbIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'warning':\n return <AlertTriangleIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n case 'important':\n return <OctagonAlertIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n default:\n return <InfoIcon className=\"fk:size-4 fk:shrink-0 fk:translate-y-0.5\" />;\n }\n}\n\nconst Callout: ComponentRenderer<CalloutProps> = ({ element }) => {\n const { props } = element;\n const type = props.type ?? 'info';\n\n return (\n <div\n className={`fk:flex fk:w-full fk:gap-3 fk:rounded-lg fk:border fk:px-4 fk:py-3 fk:text-sm ${calloutClasses[type]} fk:corner-squircle`}\n >\n <CalloutIcon type={type} />\n <div className=\"fk:min-w-0\">\n {props.title && <div className=\"fk:font-medium\">{props.title}</div>}\n <div className=\"fk:text-foreground\">{props.content}</div>\n </div>\n </div>\n );\n};\n\ninterface TimelineProps {\n items: {\n date: string | null;\n description: string | null;\n status: 'completed' | 'current' | 'upcoming' | null;\n title: string;\n }[];\n}\n\nconst timelineDotClasses = {\n completed: 'fk:border-success fk:bg-success',\n current: 'fk:border-primary fk:bg-primary',\n upcoming: 'fk:border-border fk:bg-background',\n};\n\nconst Timeline: ComponentRenderer<TimelineProps> = ({ element }) => (\n <div className=\"fk:w-full\">\n {(element.props.items ?? []).map((item, index, items) => (\n <div className=\"fk:relative fk:flex fk:gap-3 fk:pb-4 fk:last:pb-0\" key={index}>\n {index < items.length - 1 && (\n <div className=\"fk:absolute fk:left-[5px] fk:top-4 fk:h-full fk:w-px fk:bg-border\" />\n )}\n <div\n className={`fk:mt-1 fk:size-[11px] fk:shrink-0 fk:rounded-full fk:border-2 ${timelineDotClasses[item.status ?? 'upcoming']} fk:corner-squircle`}\n />\n <div className=\"fk:min-w-0\">\n <div className=\"fk:flex fk:flex-wrap fk:items-baseline fk:gap-x-2\">\n <span className=\"fk:text-sm fk:font-medium\">{item.title}</span>\n {item.date && <span className=\"fk:text-xs fk:text-muted-foreground\">{item.date}</span>}\n </div>\n {item.description && <div className=\"fk:text-sm fk:text-muted-foreground\">{item.description}</div>}\n </div>\n </div>\n ))}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Charts\n// ---------------------------------------------------------------------------\n\nconst CHART_COLORS = ['#6366f1', '#10b981', '#f59e0b', '#ef4444', '#06b6d4'];\n\nconst chartTooltipStyle = {\n background: 'hsl(var(--background))',\n border: '1px solid hsl(var(--border))',\n borderRadius: 6,\n color: 'hsl(var(--foreground))',\n fontSize: 12,\n};\n\nconst chartTooltipItemStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTooltipLabelStyle = {\n color: 'hsl(var(--foreground))',\n};\n\nconst chartTick = { fill: 'hsl(var(--muted-foreground))', fontSize: 11 };\n\ninterface ChartPoint {\n x: string;\n y: number;\n}\n\ninterface CartesianChartProps {\n aggregate: 'sum' | 'count' | 'avg' | null;\n color: string | null;\n data: { [key: string]: unknown }[];\n height: number | null;\n title: string | null;\n xKey: string;\n yKey: string;\n}\n\nfunction toNumber(value: unknown): number {\n const parsed = typeof value === 'number' ? value : Number(value);\n\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction getChartPoints(props: CartesianChartProps): ChartPoint[] {\n const data = props.data ?? [];\n\n if (!props.aggregate) {\n return data.map((row) => ({\n x: String(row[props.xKey] ?? ''),\n y: toNumber(row[props.yKey]),\n }));\n }\n\n const groups = new Map<string, { count: number; sum: number }>();\n\n for (const row of data) {\n const key = String(row[props.xKey] ?? '');\n const group = groups.get(key) ?? { count: 0, sum: 0 };\n\n group.count += 1;\n group.sum += toNumber(row[props.yKey]);\n groups.set(key, group);\n }\n\n return Array.from(groups.entries()).map(([x, group]) => {\n if (props.aggregate === 'count') {\n return { x, y: group.count };\n }\n\n if (props.aggregate === 'avg') {\n return { x, y: group.count === 0 ? 0 : group.sum / group.count };\n }\n\n return { x, y: group.sum };\n });\n}\n\nfunction ChartFrame({\n children,\n height,\n title,\n}: {\n children: JSX.Element;\n height: number | null;\n title: string | null;\n}): JSX.Element {\n return (\n <div className=\"fk:w-full\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n <div style={{ height: height ?? 256 }}>\n <ResponsiveContainer height=\"100%\" width=\"100%\">\n {children}\n </ResponsiveContainer>\n </div>\n </div>\n );\n}\n\nconst BarChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsBarChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n cursor={{ fill: 'hsl(var(--muted))' }}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Bar dataKey=\"y\" fill={color} isAnimationActive={false} name={element.props.yKey} radius={4} />\n </RechartsBarChart>\n </ChartFrame>\n );\n};\n\nconst LineChart: ComponentRenderer<CartesianChartProps> = ({ element }) => {\n const points = getChartPoints(element.props);\n const color = element.props.color ?? CHART_COLORS[0];\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsLineChart data={points}>\n <CartesianGrid stroke=\"hsl(var(--border))\" vertical={false} />\n <XAxis axisLine={false} dataKey=\"x\" tick={chartTick} tickLine={false} tickMargin={8} />\n <YAxis axisLine={false} tick={chartTick} tickLine={false} width={40} />\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Line\n dataKey=\"y\"\n dot={false}\n isAnimationActive={false}\n name={element.props.yKey}\n stroke={color}\n strokeWidth={2}\n type=\"monotone\"\n />\n </RechartsLineChart>\n </ChartFrame>\n );\n};\n\ninterface PieChartProps {\n data: { [key: string]: unknown }[];\n height: number | null;\n nameKey: string;\n title: string | null;\n valueKey: string;\n}\n\nconst PieChart: ComponentRenderer<PieChartProps> = ({ element }) => {\n const slices = (element.props.data ?? []).map((row) => ({\n name: String(row[element.props.nameKey] ?? ''),\n value: toNumber(row[element.props.valueKey]),\n }));\n\n return (\n <ChartFrame height={element.props.height} title={element.props.title}>\n <RechartsPieChart>\n <RechartsTooltip\n contentStyle={chartTooltipStyle}\n itemStyle={chartTooltipItemStyle}\n labelStyle={chartTooltipLabelStyle}\n />\n <Pie data={slices} dataKey=\"value\" innerRadius=\"45%\" isAnimationActive={false} nameKey=\"name\">\n {slices.map((slice, index) => (\n <Cell fill={CHART_COLORS[index % CHART_COLORS.length]} key={`${slice.name}-${index.toString()}`} />\n ))}\n </Pie>\n </RechartsPieChart>\n </ChartFrame>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Mermaid\n// ---------------------------------------------------------------------------\n\ninterface MermaidProps {\n chart: string;\n title: string | null;\n}\n\nconst Mermaid: ComponentRenderer<MermaidProps> = ({ element }) => {\n const { chart, title } = element.props;\n const diagramId = useId().replace(/[^a-zA-Z0-9]/g, '');\n const [svg, setSvg] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let isCancelled = false;\n\n const render = async (): Promise<void> => {\n try {\n const { default: mermaid } = await import('mermaid');\n const isDark = document.documentElement.classList.contains('dark');\n\n mermaid.initialize({ securityLevel: 'strict', startOnLoad: false, theme: isDark ? 'dark' : 'default' });\n\n const result = await mermaid.render(`fk-mermaid-${diagramId}`, chart);\n\n if (!isCancelled) {\n setSvg(result.svg);\n setError(null);\n }\n } catch (renderError) {\n if (!isCancelled) {\n setError(renderError instanceof Error ? renderError.message : 'Failed to render the diagram.');\n }\n }\n };\n\n void render();\n\n return () => {\n isCancelled = true;\n };\n }, [chart, diagramId]);\n\n return (\n <div className=\"fk:w-full fk:rounded-lg fk:border fk:border-border fk:bg-card fk:p-4 fk:corner-squircle\">\n {title && <div className=\"fk:mb-2 fk:text-sm fk:font-medium\">{title}</div>}\n {error ? (\n <pre className=\"fk:overflow-x-auto fk:whitespace-pre-wrap fk:text-xs fk:text-muted-foreground\">{chart}</pre>\n ) : null}\n {!error && svg ? (\n <div className=\"fk:flex fk:justify-center fk:overflow-x-auto\" dangerouslySetInnerHTML={{ __html: svg }} />\n ) : null}\n {!error && !svg ? <SkeletonPrimitive className=\"fk:h-40 fk:w-full\" /> : null}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Registry and spec rendering\n// ---------------------------------------------------------------------------\n\nconst registry: ComponentRegistry = {\n Accordion,\n Alert,\n Badge: BadgeComponent,\n BarChart,\n Callout,\n Card,\n Grid,\n Heading,\n Image,\n LineChart,\n Link: LinkComponent,\n Mermaid,\n Metric,\n PieChart,\n Progress,\n Separator,\n Skeleton,\n Stack,\n TabContent,\n Table,\n Tabs,\n Text,\n Timeline,\n};\n\nconst fallback: ComponentRenderer = ({ element }) => (\n <div className=\"fk:rounded-md fk:border fk:border-dashed fk:border-border fk:p-3 fk:text-sm fk:text-muted-foreground fk:corner-squircle\">\n Unsupported component: {element.type}\n </div>\n);\n\nfunction getSanitizedChildren(childKeys: string[] | undefined, elements: Spec['elements']): string[] {\n const seen = new Set<string>();\n const children: string[] = [];\n\n for (const childKey of childKeys ?? []) {\n const normalizedKey = String(childKey);\n\n if (seen.has(normalizedKey) || !elements[normalizedKey]) {\n continue;\n }\n\n seen.add(normalizedKey);\n children.push(normalizedKey);\n }\n\n return children;\n}\n\nfunction haveChildrenChanged(original: string[], sanitized: string[]): boolean {\n if (original.length !== sanitized.length) {\n return true;\n }\n\n return sanitized.some((childKey, index) => childKey !== original[index]);\n}\n\nfunction sanitizeSpec(spec: Spec): Spec | null {\n if (!spec.elements[spec.root]) {\n return null;\n }\n\n let hasChanged = false;\n const elements: Spec['elements'] = {};\n\n for (const elementKey of Object.keys(spec.elements)) {\n const element = spec.elements[elementKey];\n\n if (!element) {\n continue;\n }\n\n const elementChildren = element.children ?? [];\n const children = getSanitizedChildren(elementChildren, spec.elements);\n const hasChildrenChanged = haveChildrenChanged(elementChildren, children);\n\n if (hasChildrenChanged) {\n hasChanged = true;\n }\n\n elements[elementKey] = hasChildrenChanged ? { ...element, children } : element;\n }\n\n if (!hasChanged) {\n return spec;\n }\n\n return { ...spec, elements };\n}\n\ninterface SpecMessagePart {\n data?: unknown;\n text?: string;\n type: string;\n}\n\nconst SPEC_DATA_PART_TYPE = 'data-spec';\n\nfunction dedupeSpecParts(parts: SpecMessagePart[]): SpecMessagePart[] {\n const seenPatchLines = new Set<string>();\n const deduped: SpecMessagePart[] = [];\n\n for (const part of parts) {\n if (part.type !== SPEC_DATA_PART_TYPE) {\n continue;\n }\n\n const payload = part.data;\n\n if (payload && typeof payload === 'object' && 'type' in payload && payload.type === 'patch' && 'patch' in payload) {\n const line = JSON.stringify(payload.patch);\n\n if (seenPatchLines.has(line)) {\n continue;\n }\n\n seenPatchLines.add(line);\n }\n\n deduped.push(part);\n }\n\n return deduped;\n}\n\nexport function RunSpecPart({ parts }: { parts: SpecMessagePart[] }): JSX.Element | null {\n const spec = useMemo(() => {\n const builtSpec = buildSpecFromParts(dedupeSpecParts(parts));\n\n return builtSpec ? sanitizeSpec(builtSpec) : null;\n }, [parts]);\n const stateKey = useMemo(() => JSON.stringify(spec?.state ?? {}), [spec]);\n\n if (!spec) {\n return null;\n }\n\n return (\n <StateProvider initialState={spec.state} key={stateKey}>\n <VisibilityProvider>\n <ActionProvider>\n <Renderer fallback={fallback} registry={registry} spec={spec} />\n </ActionProvider>\n </VisibilityProvider>\n </StateProvider>\n );\n}\n\nexport type { SpecMessagePart };\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  handleFlexkitRequest
3
- } from "./chunk-C4XLDODU.js";
3
+ } from "./chunk-C2KPTRYM.js";
4
4
 
5
5
  // src/auth/tanstack-start-api.ts
6
6
  function getCookieValue(cookieHeader, name) {
package/dist/ui.js CHANGED
@@ -1,2 +1,2 @@
1
- import'./index.css';export{Tc as Alert,Vc as AlertDescription,Uc as AlertTitle,Gb as Attachment,Mb as AttachmentAction,Lb as AttachmentActions,Ib as AttachmentContent,Kb as AttachmentDescription,Na as AttachmentEmpty,Ob as AttachmentGroup,Ka as AttachmentHoverCard,Ma as AttachmentHoverCardContent,La as AttachmentHoverCardTrigger,Ia as AttachmentInfo,Hb as AttachmentMedia,Ha as AttachmentPreview,Ja as AttachmentRemove,Jb as AttachmentTitle,Nb as AttachmentTrigger,Ga as Attachments,o as Checkbox,Va as CodeBlock,Ta as CodeBlockActions,Pa as CodeBlockContainer,Ua as CodeBlockContent,Wa as CodeBlockCopyButton,Sa as CodeBlockFilename,Qa as CodeBlockHeader,Xa as CodeBlockLanguageSelector,_a as CodeBlockLanguageSelectorContent,$a as CodeBlockLanguageSelectorItem,Ya as CodeBlockLanguageSelectorTrigger,Za as CodeBlockLanguageSelectorValue,Ra as CodeBlockTitle,p as Collapsible,r as CollapsibleContent,q as CollapsibleTrigger,ab as Conversation,bb as ConversationContent,fb as ConversationDownload,cb as ConversationEmptyState,db as ConversationScrollButton,pa as DrawerModal,f as ExternalLink,g as Form,l as FormControl,m as FormDescription,h as FormField,j as FormItem,k as FormLabel,n as FormMessage,sa as HoverCard,ua as HoverCardContent,ta as HoverCardTrigger,s as Input,wa as InputGroup,xa as InputGroupAddon,ya as InputGroupButton,Aa as InputGroupInput,za as InputGroupText,Ba as InputGroupTextarea,ma as InsufficientPermissionsTooltipContent,e as Label,Tb as LocalReferencedSourcesContext,gb as Message,jb as MessageAction,ib as MessageActions,kb as MessageBranch,lb as MessageBranchContent,ob as MessageBranchNext,pb as MessageBranchPage,nb as MessageBranchPrevious,mb as MessageBranchSelector,hb as MessageContent,qb as MessageResponse,rb as MessageToolbar,sb as ModelSelector,ub as ModelSelectorContent,vb as ModelSelectorDialog,yb as ModelSelectorEmpty,zb as ModelSelectorGroup,wb as ModelSelectorInput,Ab as ModelSelectorItem,xb as ModelSelectorList,Db as ModelSelectorLogo,Eb as ModelSelectorLogoGroup,Fb as ModelSelectorName,Cb as ModelSelectorSeparator,Bb as ModelSelectorShortcut,tb as ModelSelectorTrigger,na as PermissionTooltip,t as Popover,w as PopoverAnchor,v as PopoverContent,u as PopoverTrigger,Xb as PromptInput,Vb as PromptInputActionAddAttachments,Wb as PromptInputActionAddScreenshot,cc as PromptInputActionMenu,ec as PromptInputActionMenuContent,fc as PromptInputActionMenuItem,dc as PromptInputActionMenuTrigger,Yb as PromptInputBody,bc as PromptInputButton,uc as PromptInputCommand,xc as PromptInputCommandEmpty,yc as PromptInputCommandGroup,vc as PromptInputCommandInput,zc as PromptInputCommandItem,wc as PromptInputCommandList,Ac as PromptInputCommandSeparator,$b as PromptInputFooter,_b as PromptInputHeader,mc as PromptInputHoverCard,oc as PromptInputHoverCardContent,nc as PromptInputHoverCardTrigger,Rb as PromptInputProvider,hc as PromptInputSelect,jc as PromptInputSelectContent,kc as PromptInputSelectItem,ic as PromptInputSelectTrigger,lc as PromptInputSelectValue,gc as PromptInputSubmit,qc as PromptInputTab,sc as PromptInputTabBody,tc as PromptInputTabItem,rc as PromptInputTabLabel,pc as PromptInputTabsList,Zb as PromptInputTextarea,ac as PromptInputTools,Dc as Reasoning,Fc as ReasoningContent,Ec as ReasoningTrigger,z as ResizableHandle,y as ResizablePanel,x as ResizablePanelGroup,A as Sheet,C as SheetClose,F as SheetContent,J as SheetDescription,H as SheetFooter,G as SheetHeader,E as SheetOverlay,D as SheetPortal,I as SheetTitle,B as SheetTrigger,Bc as Shimmer,Z as Sidebar,R as SidebarContent,S as SidebarGroup,U as SidebarGroupContent,T as SidebarGroupLabel,Q as SidebarInset,V as SidebarMenu,X as SidebarMenuButton,W as SidebarMenuItem,N as SidebarPanel,M as SidebarProvider,P as SidebarRail,O as SidebarTrigger,Jc as Source,Gc as Sources,Ic as SourcesContent,Hc as SourcesTrigger,Kc as SpeechInput,va as Spinner,Mc as Suggestion,Lc as Suggestions,_ as Switch,$ as Table,ba as TableBody,ga as TableCaption,fa as TableCell,ca as TableFooter,ea as TableHead,aa as TableHeader,da as TableRow,ha as Tabs,ka as TabsContent,ia as TabsList,ja as TabsTrigger,la as Textarea,ra as Toaster,b as Toggle,c as ToggleGroup,d as ToggleGroupItem,Nc as Tool,Qc as ToolContent,Pc as ToolHeader,Rc as ToolInput,Sc as ToolOutput,Da as getAttachmentLabel,Ca as getMediaCategory,Oc as getStatusBadge,Oa as highlightCode,eb as messagesToMarkdown,K as readSidebarCookieState,qa as toast,a as toggleVariants,Fa as useAttachmentContext,Ea as useAttachmentsContext,i as useFormField,Sb as usePromptInputAttachments,Pb as usePromptInputController,Ub as usePromptInputReferencedSources,Qb as useProviderAttachments,Cc as useReasoning,L as useSidebar}from'./chunk-DGIY4SKN.js';export{a as Avatar,c as AvatarFallback,d as AvatarGroup,b as AvatarImage,e as DropdownMenu,k as DropdownMenuCheckboxItem,h as DropdownMenuContent,i as DropdownMenuGroup,j as DropdownMenuItem,n as DropdownMenuLabel,f as DropdownMenuPortal,l as DropdownMenuRadioGroup,m as DropdownMenuRadioItem,o as DropdownMenuSeparator,p as DropdownMenuShortcut,q as DropdownMenuSub,s as DropdownMenuSubContent,r as DropdownMenuSubTrigger,g as DropdownMenuTrigger,t as Skeleton}from'./chunk-SZEGGBOC.js';export{b as Badge,z as ButtonGroup,B as ButtonGroupSeparator,A as ButtonGroupText,m as Command,n as CommandDialog,q as CommandEmpty,r as CommandGroup,o as CommandInput,t as CommandItem,p as CommandList,s as CommandSeparator,u as CommandShortcut,c as Dialog,f as DialogClose,h as DialogContent,l as DialogDescription,j as DialogFooter,i as DialogHeader,g as DialogOverlay,e as DialogPortal,k as DialogTitle,d as DialogTrigger,w as ScrollArea,x as ScrollBar,v as Separator,a as badgeVariants,y as buttonGroupVariants}from'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';export{a as Select,e as SelectContent,b as SelectGroup,g as SelectItem,f as SelectLabel,j as SelectScrollDownButton,i as SelectScrollUpButton,h as SelectSeparator,d as SelectTrigger,c as SelectValue}from'./chunk-HDOIOXMP.js';export{b as Tooltip,e as TooltipContent,d as TooltipPortal,a as TooltipProvider,c as TooltipTrigger}from'./chunk-USNXQOMJ.js';export{b as Button,a as buttonVariants}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';//# sourceMappingURL=ui.js.map
1
+ import'./index.css';export{Eb as Attachment,Kb as AttachmentAction,Jb as AttachmentActions,Gb as AttachmentContent,Ib as AttachmentDescription,La as AttachmentEmpty,Mb as AttachmentGroup,Ia as AttachmentHoverCard,Ka as AttachmentHoverCardContent,Ja as AttachmentHoverCardTrigger,Ga as AttachmentInfo,Fb as AttachmentMedia,Fa as AttachmentPreview,Ha as AttachmentRemove,Hb as AttachmentTitle,Lb as AttachmentTrigger,Ea as Attachments,n as Checkbox,Ta as CodeBlock,Ra as CodeBlockActions,Na as CodeBlockContainer,Sa as CodeBlockContent,Ua as CodeBlockCopyButton,Qa as CodeBlockFilename,Oa as CodeBlockHeader,Va as CodeBlockLanguageSelector,Ya as CodeBlockLanguageSelectorContent,Za as CodeBlockLanguageSelectorItem,Wa as CodeBlockLanguageSelectorTrigger,Xa as CodeBlockLanguageSelectorValue,Pa as CodeBlockTitle,o as Collapsible,q as CollapsibleContent,p as CollapsibleTrigger,_a as Conversation,$a as ConversationContent,db as ConversationDownload,ab as ConversationEmptyState,bb as ConversationScrollButton,na as DrawerModal,e as ExternalLink,f as Form,k as FormControl,l as FormDescription,g as FormField,i as FormItem,j as FormLabel,m as FormMessage,qa as HoverCard,sa as HoverCardContent,ra as HoverCardTrigger,ua as InputGroup,va as InputGroupAddon,wa as InputGroupButton,ya as InputGroupInput,xa as InputGroupText,za as InputGroupTextarea,ka as InsufficientPermissionsTooltipContent,Rb as LocalReferencedSourcesContext,eb as Message,hb as MessageAction,gb as MessageActions,ib as MessageBranch,jb as MessageBranchContent,mb as MessageBranchNext,nb as MessageBranchPage,lb as MessageBranchPrevious,kb as MessageBranchSelector,fb as MessageContent,ob as MessageResponse,pb as MessageToolbar,qb as ModelSelector,sb as ModelSelectorContent,tb as ModelSelectorDialog,wb as ModelSelectorEmpty,xb as ModelSelectorGroup,ub as ModelSelectorInput,yb as ModelSelectorItem,vb as ModelSelectorList,Bb as ModelSelectorLogo,Cb as ModelSelectorLogoGroup,Db as ModelSelectorName,Ab as ModelSelectorSeparator,zb as ModelSelectorShortcut,rb as ModelSelectorTrigger,la as PermissionTooltip,r as Popover,u as PopoverAnchor,t as PopoverContent,s as PopoverTrigger,Vb as PromptInput,Tb as PromptInputActionAddAttachments,Ub as PromptInputActionAddScreenshot,ac as PromptInputActionMenu,cc as PromptInputActionMenuContent,dc as PromptInputActionMenuItem,bc as PromptInputActionMenuTrigger,Wb as PromptInputBody,$b as PromptInputButton,sc as PromptInputCommand,vc as PromptInputCommandEmpty,wc as PromptInputCommandGroup,tc as PromptInputCommandInput,xc as PromptInputCommandItem,uc as PromptInputCommandList,yc as PromptInputCommandSeparator,Zb as PromptInputFooter,Yb as PromptInputHeader,kc as PromptInputHoverCard,mc as PromptInputHoverCardContent,lc as PromptInputHoverCardTrigger,Pb as PromptInputProvider,fc as PromptInputSelect,hc as PromptInputSelectContent,ic as PromptInputSelectItem,gc as PromptInputSelectTrigger,jc as PromptInputSelectValue,ec as PromptInputSubmit,oc as PromptInputTab,qc as PromptInputTabBody,rc as PromptInputTabItem,pc as PromptInputTabLabel,nc as PromptInputTabsList,Xb as PromptInputTextarea,_b as PromptInputTools,Bc as Reasoning,Dc as ReasoningContent,Cc as ReasoningTrigger,x as ResizableHandle,w as ResizablePanel,v as ResizablePanelGroup,y as Sheet,A as SheetClose,D as SheetContent,H as SheetDescription,F as SheetFooter,E as SheetHeader,C as SheetOverlay,B as SheetPortal,G as SheetTitle,z as SheetTrigger,zc as Shimmer,X as Sidebar,P as SidebarContent,Q as SidebarGroup,S as SidebarGroupContent,R as SidebarGroupLabel,O as SidebarInset,T as SidebarMenu,V as SidebarMenuButton,U as SidebarMenuItem,L as SidebarPanel,K as SidebarProvider,N as SidebarRail,M as SidebarTrigger,Hc as Source,Ec as Sources,Gc as SourcesContent,Fc as SourcesTrigger,Ic as SpeechInput,ta as Spinner,Kc as Suggestion,Jc as Suggestions,Y as Switch,Z as Table,$ as TableBody,ea as TableCaption,da as TableCell,aa as TableFooter,ca as TableHead,_ as TableHeader,ba as TableRow,fa as Tabs,ia as TabsContent,ga as TabsList,ha as TabsTrigger,ja as Textarea,pa as Toaster,b as Toggle,c as ToggleGroup,d as ToggleGroupItem,Lc as Tool,Oc as ToolContent,Nc as ToolHeader,Pc as ToolInput,Qc as ToolOutput,Ba as getAttachmentLabel,Aa as getMediaCategory,Mc as getStatusBadge,Ma as highlightCode,cb as messagesToMarkdown,I as readSidebarCookieState,oa as toast,a as toggleVariants,Da as useAttachmentContext,Ca as useAttachmentsContext,h as useFormField,Qb as usePromptInputAttachments,Nb as usePromptInputController,Sb as usePromptInputReferencedSources,Ob as useProviderAttachments,Ac as useReasoning,J as useSidebar}from'./chunk-L5T56MRH.js';export{a as Avatar,c as AvatarFallback,d as AvatarGroup,b as AvatarImage,e as DropdownMenu,k as DropdownMenuCheckboxItem,h as DropdownMenuContent,i as DropdownMenuGroup,j as DropdownMenuItem,n as DropdownMenuLabel,f as DropdownMenuPortal,l as DropdownMenuRadioGroup,m as DropdownMenuRadioItem,o as DropdownMenuSeparator,p as DropdownMenuShortcut,q as DropdownMenuSub,s as DropdownMenuSubContent,r as DropdownMenuSubTrigger,g as DropdownMenuTrigger,t as Skeleton}from'./chunk-A4DPLZZF.js';export{c as Alert,e as AlertDescription,d as AlertTitle,b as Input,a as Label}from'./chunk-3SY46ERM.js';export{b as Badge,p as ButtonGroup,r as ButtonGroupSeparator,q as ButtonGroupText,c as Command,d as CommandDialog,g as CommandEmpty,h as CommandGroup,e as CommandInput,j as CommandItem,f as CommandList,i as CommandSeparator,k as CommandShortcut,m as ScrollArea,n as ScrollBar,l as Separator,a as badgeVariants,o as buttonGroupVariants}from'./chunk-5JUG4BEF.js';export{k as Dialog,n as DialogClose,p as DialogContent,t as DialogDescription,r as DialogFooter,q as DialogHeader,o as DialogOverlay,m as DialogPortal,s as DialogTitle,l as DialogTrigger,a as Select,e as SelectContent,b as SelectGroup,g as SelectItem,f as SelectLabel,j as SelectScrollDownButton,i as SelectScrollUpButton,h as SelectSeparator,d as SelectTrigger,c as SelectValue}from'./chunk-S7Z6KKIN.js';import'./chunk-U45E5X3H.js';export{b as Tooltip,e as TooltipContent,d as TooltipPortal,a as TooltipProvider,c as TooltipTrigger}from'./chunk-N33S7BSG.js';export{c as Button,b as buttonVariants}from'./chunk-X3SHNHHM.js';//# sourceMappingURL=ui.js.map
2
2
  //# sourceMappingURL=ui.js.map
@@ -0,0 +1,2 @@
1
+ import'./index.css';import {g}from'./chunk-MBBE4RND.js';import'./chunk-5CVDMZUI.js';import {t,e,g as g$1,a,b as b$1,c as c$1,h,n,o,k,j,p}from'./chunk-A4DPLZZF.js';import {b}from'./chunk-U45E5X3H.js';import {c}from'./chunk-X3SHNHHM.js';import v from'boring-avatars';import {Monitor,Moon,Sun}from'lucide-react';import {jsx,jsxs}from'react/jsx-runtime';var A=["#06d9b6","#a4f479","#d4d323","#fb468f","#0ec4f1"];function F({projectId:D}){let{theme:r,setTheme:t$1}=b(),[C,n$1]=g();return C?jsx(t,{className:"fk:h-8 fk:w-8 fk:rounded-full"}):jsxs(e,{children:[jsx(g$1,{asChild:true,children:jsx(c,{className:"fk:relative fk:h-8 fk:w-8 fk:rounded-full",variant:"ghost",children:jsxs(a,{className:"fk:h-8 fk:w-8",children:[n$1.user?.avatar_url?jsx(b$1,{alt:n$1.user.display_name,src:n$1.user.avatar_url}):null,jsx(c$1,{className:"fk:bg-transparent",children:jsx(v,{className:"fk:size-8",colors:A,name:n$1.user?.id??"user",size:32,variant:"marble"})})]})})}),jsxs(h,{align:"end",className:"fk:w-56",forceMount:true,children:[jsx(n,{className:"font-normal",children:jsxs("div",{className:"fk:flex fk:flex-col fk:space-y-1",children:[jsx("p",{className:"fk:text-sm fk:font-medium fk:leading-none",children:n$1.user?.display_name}),jsx("p",{className:"fk:text-xs fk:leading-none fk:text-muted-foreground",children:n$1.user?.email})]})}),jsx(o,{}),jsx(n,{children:"Theme"}),jsxs(k,{checked:r==="system",onCheckedChange:()=>{t$1("system");},children:[jsx(Monitor,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"System"})]}),jsxs(k,{checked:r==="dark",onCheckedChange:()=>{t$1("dark");},children:[jsx(Moon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Dark"})]}),jsxs(k,{checked:r==="light",onCheckedChange:()=>{t$1("light");},children:[jsx(Sun,{className:"fk:mr-2 fk:h-4 fk:w-4"}),jsx("span",{children:"Light"})]}),jsx(o,{}),jsxs(j,{onClick:()=>{n$1.logout(D).then(()=>{}).catch(()=>{});},children:["Log out",jsx(p,{children:"\u21E7\u2318Q"})]})]})]})}export{F as UserNav};//# sourceMappingURL=user-nav-ZH63YHX7.js.map
2
+ //# sourceMappingURL=user-nav-ZH63YHX7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/components/user-nav.tsx"],"names":["AVATAR_COLORS","UserNav","projectId","theme","setTheme","useTheme","isLoading","auth","useAuth","jsx","Skeleton","jsxs","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","BoringAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Monitor","Moon","Sun","DropdownMenuItem","DropdownMenuShortcut"],"mappings":"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","file":"user-nav-OWTTAXZS.js","sourcesContent":["import type { JSX } from 'react';\nimport BoringAvatar from 'boring-avatars';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { useTheme } from '../theme-context';\nimport { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { Button } from '../primitives/button';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '../primitives/dropdown-menu';\nimport { useAuth } from '../../auth/auth-context';\n\nconst AVATAR_COLORS = ['#06d9b6', '#a4f479', '#d4d323', '#fb468f', '#0ec4f1'];\n\ntype Props = {\n projectId: string;\n};\n\nexport function UserNav({ projectId }: Props): JSX.Element {\n const { theme, setTheme } = useTheme();\n const [isLoading, auth] = useAuth();\n\n if (isLoading) {\n return <Skeleton className=\"fk:h-8 fk:w-8 fk:rounded-full\" />;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:relative fk:h-8 fk:w-8 fk:rounded-full\" variant=\"ghost\">\n <Avatar className=\"fk:h-8 fk:w-8\">\n {auth.user?.avatar_url ? <AvatarImage alt={auth.user.display_name} src={auth.user.avatar_url} /> : null}\n <AvatarFallback className=\"fk:bg-transparent\">\n <BoringAvatar\n className=\"fk:size-8\"\n colors={AVATAR_COLORS}\n name={auth.user?.id ?? 'user'}\n size={32}\n variant=\"marble\"\n />\n </AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-56\" forceMount>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"fk:flex fk:flex-col fk:space-y-1\">\n <p className=\"fk:text-sm fk:font-medium fk:leading-none\">{auth.user?.display_name}</p>\n <p className=\"fk:text-xs fk:leading-none fk:text-muted-foreground\">{auth.user?.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Theme</DropdownMenuLabel>\n <DropdownMenuCheckboxItem\n checked={theme === 'system'}\n onCheckedChange={() => {\n setTheme('system');\n }}\n >\n <Monitor className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>System</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'dark'}\n onCheckedChange={() => {\n setTheme('dark');\n }}\n >\n <Moon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Dark</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'light'}\n onCheckedChange={() => {\n setTheme('light');\n }}\n >\n <Sun className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Light</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n auth\n .logout(projectId)\n .then(() => {\n //\n })\n .catch(() => {\n //\n });\n }}\n >\n Log out\n <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/ui/components/user-nav.tsx"],"names":["AVATAR_COLORS","UserNav","projectId","theme","setTheme","useTheme","isLoading","auth","useAuth","jsx","Skeleton","jsxs","DropdownMenu","DropdownMenuTrigger","Button","Avatar","AvatarImage","AvatarFallback","BoringAvatar","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Monitor","Moon","Sun","DropdownMenuItem","DropdownMenuShortcut"],"mappings":"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","file":"user-nav-ZH63YHX7.js","sourcesContent":["import type { JSX } from 'react';\nimport BoringAvatar from 'boring-avatars';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { useTheme } from '../theme-context';\nimport { Avatar, AvatarFallback, AvatarImage } from '../primitives/avatar';\nimport { Button } from '../primitives/button';\nimport { Skeleton } from '../primitives/skeleton';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '../primitives/dropdown-menu';\nimport { useAuth } from '../../auth/auth-context';\n\nconst AVATAR_COLORS = ['#06d9b6', '#a4f479', '#d4d323', '#fb468f', '#0ec4f1'];\n\ntype Props = {\n projectId: string;\n};\n\nexport function UserNav({ projectId }: Props): JSX.Element {\n const { theme, setTheme } = useTheme();\n const [isLoading, auth] = useAuth();\n\n if (isLoading) {\n return <Skeleton className=\"fk:h-8 fk:w-8 fk:rounded-full\" />;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:relative fk:h-8 fk:w-8 fk:rounded-full\" variant=\"ghost\">\n <Avatar className=\"fk:h-8 fk:w-8\">\n {auth.user?.avatar_url ? <AvatarImage alt={auth.user.display_name} src={auth.user.avatar_url} /> : null}\n <AvatarFallback className=\"fk:bg-transparent\">\n <BoringAvatar\n className=\"fk:size-8\"\n colors={AVATAR_COLORS}\n name={auth.user?.id ?? 'user'}\n size={32}\n variant=\"marble\"\n />\n </AvatarFallback>\n </Avatar>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-56\" forceMount>\n <DropdownMenuLabel className=\"font-normal\">\n <div className=\"fk:flex fk:flex-col fk:space-y-1\">\n <p className=\"fk:text-sm fk:font-medium fk:leading-none\">{auth.user?.display_name}</p>\n <p className=\"fk:text-xs fk:leading-none fk:text-muted-foreground\">{auth.user?.email}</p>\n </div>\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Theme</DropdownMenuLabel>\n <DropdownMenuCheckboxItem\n checked={theme === 'system'}\n onCheckedChange={() => {\n setTheme('system');\n }}\n >\n <Monitor className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>System</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'dark'}\n onCheckedChange={() => {\n setTheme('dark');\n }}\n >\n <Moon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Dark</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuCheckboxItem\n checked={theme === 'light'}\n onCheckedChange={() => {\n setTheme('light');\n }}\n >\n <Sun className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n <span>Light</span>\n </DropdownMenuCheckboxItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => {\n auth\n .logout(projectId)\n .then(() => {\n //\n })\n .catch(() => {\n //\n });\n }}\n >\n Log out\n <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}