strapi-content-embeddings 0.1.9 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/App-ByRBbkZn.js +1 -0
- package/dist/_chunks/App-ByRBbkZn.js.map +1 -0
- package/dist/_chunks/App-MjsTrWRS.mjs +1 -0
- package/dist/_chunks/App-MjsTrWRS.mjs.map +1 -0
- package/dist/_chunks/en-B4KWt_jN.js +1 -0
- package/dist/_chunks/en-B4KWt_jN.js.map +1 -0
- package/dist/_chunks/en-Byx4XI2L.mjs +1 -0
- package/dist/_chunks/en-Byx4XI2L.mjs.map +1 -0
- package/dist/_chunks/index-TWbcT-zJ.js +1 -0
- package/dist/_chunks/index-TWbcT-zJ.js.map +1 -0
- package/dist/_chunks/index-ifqYByO5.mjs +1 -0
- package/dist/_chunks/index-ifqYByO5.mjs.map +1 -0
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -0
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +1 -0
- package/dist/server/index.mjs.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App-ByRBbkZn.js","sources":["../../admin/src/components/custom/Illo.tsx","../../admin/src/components/custom/EmptyState.tsx","../../admin/src/components/custom/EmbeddingsTable.tsx","../../admin/src/components/custom/Markdown.tsx","../../admin/src/components/custom/ChatModal.tsx","../../admin/src/utils/api.ts","../../admin/src/components/custom/SyncModal.tsx","../../admin/src/pages/HomePage.tsx","../../admin/src/components/forms/CreateEmbeddingForm.tsx","../../admin/src/components/custom/BackLink.tsx","../../admin/src/pages/CreateEmbeddings.tsx","../../admin/src/pages/EmbeddingDetails.tsx","../../admin/src/pages/App.tsx"],"sourcesContent":["export const Illo = () => (\n <svg width=\"159\" height=\"88\" viewBox=\"0 0 159 88\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M134.933 17.417C137.768 17.417 140.067 19.7153 140.067 22.5503C140.067 25.3854 137.768 27.6837 134.933 27.6837H105.6C108.435 27.6837 110.733 29.9819 110.733 32.817C110.733 35.6521 108.435 37.9503 105.6 37.9503H121.733C124.568 37.9503 126.867 40.2486 126.867 43.0837C126.867 45.9187 124.568 48.217 121.733 48.217H114.272C110.698 48.217 107.8 50.5153 107.8 53.3503C107.8 55.2404 109.267 56.9515 112.2 58.4837C115.035 58.4837 117.333 60.7819 117.333 63.617C117.333 66.4521 115.035 68.7503 112.2 68.7503H51.3333C48.4982 68.7503 46.2 66.4521 46.2 63.617C46.2 60.7819 48.4982 58.4837 51.3333 58.4837H22.7333C19.8982 58.4837 17.6 56.1854 17.6 53.3503C17.6 50.5153 19.8982 48.217 22.7333 48.217H52.0666C54.9017 48.217 57.2 45.9187 57.2 43.0837C57.2 40.2486 54.9017 37.9503 52.0666 37.9503H33.7333C30.8982 37.9503 28.6 35.6521 28.6 32.817C28.6 29.9819 30.8982 27.6837 33.7333 27.6837H63.0666C60.2316 27.6837 57.9333 25.3854 57.9333 22.5503C57.9333 19.7153 60.2316 17.417 63.0666 17.417H134.933ZM134.933 37.9503C137.768 37.9503 140.067 40.2486 140.067 43.0837C140.067 45.9187 137.768 48.217 134.933 48.217C132.098 48.217 129.8 45.9187 129.8 43.0837C129.8 40.2486 132.098 37.9503 134.933 37.9503Z\"\n fill=\"#DBDBFA\"\n />\n\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M95.826 16.6834L102.647 66.4348L103.26 71.4261C103.458 73.034 102.314 74.4976 100.706 74.695L57.7621 79.9679C56.1542 80.1653 54.6906 79.0219 54.4932 77.4139L47.8816 23.5671C47.7829 22.7631 48.3546 22.0313 49.1586 21.9326C49.1637 21.932 49.1688 21.9313 49.1739 21.9307L52.7367 21.5311L95.826 16.6834ZM55.6176 21.208L58.9814 20.8306Z\"\n fill=\"white\"\n />\n\n <path\n d=\"M55.6176 21.208L58.9814 20.8306M95.826 16.6834L102.647 66.4348L103.26 71.4261C103.458 73.034 102.314 74.4976 100.706 74.695L57.7621 79.9679C56.1542 80.1653 54.6906 79.0219 54.4932 77.4139L47.8816 23.5671C47.7829 22.7631 48.3546 22.0313 49.1586 21.9326C49.1637 21.932 49.1688 21.9313 49.1739 21.9307L52.7367 21.5311L95.826 16.6834Z\"\n stroke=\"#7E7BF6\"\n strokeWidth=\"2.5\"\n />\n\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M93.9695 19.8144L100.144 64.9025L100.699 69.4258C100.878 70.8831 99.8559 72.2077 98.416 72.3845L59.9585 77.1065C58.5185 77.2833 57.2062 76.2453 57.0272 74.7881L51.0506 26.112C50.9519 25.308 51.5236 24.5762 52.3276 24.4775L57.0851 23.8934\"\n fill=\"#F0F0FF\"\n />\n\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M97.701 7.33301H64.2927C63.7358 7.33301 63.2316 7.55873 62.8667 7.92368C62.5017 8.28862 62.276 8.79279 62.276 9.34967V65.083C62.276 65.6399 62.5017 66.1441 62.8667 66.509C63.2316 66.874 63.7358 67.0997 64.2927 67.0997H107.559C108.116 67.0997 108.62 66.874 108.985 66.509C109.35 66.1441 109.576 65.6399 109.576 65.083V19.202C109.576 18.6669 109.363 18.1537 108.985 17.7755L99.1265 7.92324C98.7484 7.54531 98.2356 7.33301 97.701 7.33301Z\"\n fill=\"white\"\n stroke=\"#7F7CFA\"\n strokeWidth=\"2.5\"\n />\n\n <path\n d=\"M98.026 8.17871V16.6833C98.026 17.8983 99.011 18.8833 100.226 18.8833H106.044\"\n stroke=\"#807EFA\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n\n <path\n d=\"M70.1594 56.2838H89.2261M70.1594 18.8838H89.2261H70.1594ZM70.1594 27.6838H101.693H70.1594ZM70.1594 37.2171H101.693H70.1594ZM70.1594 46.7505H101.693H70.1594Z\"\n stroke=\"#817FFA\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n","import { EmptyStateLayout, Button } from '@strapi/design-system';\nimport { Link } from 'react-router-dom';\nimport { PLUGIN_ID } from \"../../pluginId\"\nimport { Plus } from '@strapi/icons';\nimport { Illo } from './Illo';\n\nexport function EmptyState() {\n return (\n <EmptyStateLayout\n icon={<Illo />}\n content=\"Let's create our first embedding...\"\n action={\n <Link to={`/plugins/${PLUGIN_ID}/embeddings`}>\n <Button startIcon={<Plus />}>Create new embedding</Button>\n </Link>\n }\n />\n );\n}","import React from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport {\n Box,\n Table,\n Thead,\n Tbody,\n Tr,\n Td,\n Th,\n Typography,\n VisuallyHidden,\n Flex,\n IconButton,\n} from \"@strapi/design-system\";\nimport { ArrowRight } from \"@strapi/icons\";\nimport { PLUGIN_ID } from \"../../pluginId\";\n\nconst StyledTr = styled(Tr)`\n cursor: pointer;\n &:hover {\n background-color: #f0f0ff;\n }\n`;\n\ninterface Embedding {\n id: number;\n documentId: string;\n title: string;\n content?: string;\n embeddingId?: string;\n}\n\ninterface EmbeddingsTableProps {\n data: Embedding[];\n}\n\nexport function EmbeddingsTable({ data }: Readonly<EmbeddingsTableProps>) {\n const navigate = useNavigate();\n\n const handleRowClick = (documentId: string) => {\n navigate(`/plugins/${PLUGIN_ID}/embeddings/${documentId}`);\n };\n\n return (\n <Box padding={0} background=\"neutral100\">\n <Table colCount={5} rowCount={data.length + 1}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">ID</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Title</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Content</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Embed ID</Typography>\n </Th>\n <Th>\n <VisuallyHidden>Actions</VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data?.map((entry) => (\n <StyledTr\n key={entry.documentId}\n onClick={() => handleRowClick(entry.documentId)}\n >\n <Td>\n <Typography textColor=\"neutral800\">\n {entry.documentId.slice(0, 8)}...\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {entry.title?.slice(0, 30)}\n {entry.title?.length > 30 ? \"...\" : \"\"}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {entry.content?.slice(0, 30)}\n {entry.content && entry.content.length > 30 ? \"...\" : \"\"}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {entry.embeddingId?.slice(0, 8)}\n {entry.embeddingId && entry.embeddingId.length > 8\n ? \"...\"\n : \"\"}\n </Typography>\n </Td>\n <Td>\n <Flex>\n <IconButton\n withTooltip={false}\n label=\"View details\"\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n handleRowClick(entry.documentId);\n }}\n >\n <ArrowRight />\n </IconButton>\n </Flex>\n </Td>\n </StyledTr>\n ))}\n </Tbody>\n </Table>\n </Box>\n );\n}\n","import React from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport styled from \"styled-components\";\n\nconst MarkdownWrapper = styled.div`\n /* Headers */\n h1 {\n font-size: 2.25rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h2 {\n font-size: 1.75rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h3 {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h4 {\n font-size: 1.25rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h5 {\n font-size: 1.125rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h6 {\n font-size: 1rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #9d4edd;\n }\n\n /* Horizontal rules */\n hr {\n border-color: #d1d5db;\n margin-top: 2rem;\n margin-bottom: 2rem;\n }\n\n a {\n color: #4945ff;\n text-decoration: underline;\n }\n\n /* Paragraphs */\n p {\n margin-bottom: 1rem;\n line-height: 1.5rem;\n color: #39393a;\n }\n\n /* Emphasis */\n strong {\n font-weight: 700;\n }\n\n em {\n font-style: italic;\n }\n\n del {\n text-decoration: line-through;\n }\n\n /* Blockquotes */\n blockquote {\n border-left-width: 1px;\n border-color: #9ca3af;\n padding-left: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 1rem;\n }\n\n /* Lists */\n ul {\n list-style-type: disc;\n padding-left: 1rem;\n margin-bottom: 1rem;\n }\n\n ol {\n list-style-type: decimal;\n padding-left: 1rem;\n margin-bottom: 1rem;\n }\n\n li {\n margin-bottom: 0.5rem;\n }\n\n li > ul {\n list-style-type: disc;\n padding-left: 1rem;\n margin-bottom: 0.5rem;\n }\n\n li > ol {\n list-style-type: decimal;\n padding-left: 1rem;\n margin-bottom: 0.5rem;\n }\n\n /* Code blocks */\n pre {\n font-family: monospace;\n background-color: #1f2937;\n color: #f9fafb;\n border-radius: 0.375rem;\n padding: 1rem;\n margin-top: 1.5rem;\n margin-bottom: 1.5rem;\n line-height: 1.5rem;\n overflow: auto;\n }\n\n code {\n font-family: monospace;\n background-color: #1f2937;\n color: #f9fafb;\n border-radius: 0.375rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n }\n\n /* Tables */\n table {\n width: 100%;\n border-collapse: collapse;\n border-color: #d1d5db;\n margin-top: 1.5rem;\n margin-bottom: 1.5rem;\n }\n\n th {\n background-color: #1f2937;\n text-align: left;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-weight: 600;\n border-bottom-width: 1px;\n border-color: #d1d5db;\n }\n\n td {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n padding-right: 1rem;\n border-bottom-width: 1px;\n border-color: #d1d5db;\n }\n\n /* Images */\n img {\n width: 100%;\n object-fit: cover;\n border-radius: 0.75rem;\n margin-top: 1.5rem;\n margin-bottom: 1.5rem;\n }\n`;\n\ninterface MarkdownProps {\n children: string;\n}\n\nexport function Markdown({ children }: MarkdownProps) {\n return (\n <MarkdownWrapper>\n <ReactMarkdown>{children}</ReactMarkdown>\n </MarkdownWrapper>\n );\n}\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport qs from \"qs\";\nimport { useFetchClient } from \"@strapi/strapi/admin\";\nimport {\n Button,\n Typography,\n Box,\n TextInput,\n Modal,\n Accordion,\n Link,\n} from \"@strapi/design-system\";\n\nimport { PLUGIN_ID } from \"../../pluginId\";\nimport { RobotIcon } from \"./RobotIcon\";\nimport { Markdown } from \"./Markdown\";\n\nconst StyledButton = styled(Button)`\n position: fixed;\n bottom: 1.5rem;\n right: 1.5rem;\n height: 3.5rem;\n width: 3.5rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),\n 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n z-index: 100;\n\n svg {\n height: 1.75rem;\n width: 1.75rem;\n }\n`;\n\nconst ResponseContainer = styled.div`\n border: solid 1px #e3e9f3;\n border-radius: 4px;\n padding: 1rem;\n color: #32324d;\n font-weight: 400;\n font-size: 0.875rem;\n display: block;\n width: 100%;\n max-height: 400px;\n background: inherit;\n overflow-y: auto;\n scroll-behavior: smooth;\n`;\n\ninterface SourceDocument {\n pageContent: string;\n metadata: {\n id: string;\n title: string;\n collectionType?: string;\n fieldName?: string;\n };\n}\n\ninterface QueryResponse {\n text: string;\n sourceDocuments: SourceDocument[];\n}\n\ninterface AccordionDetailsProps {\n title: string;\n content: React.ReactNode;\n children?: React.ReactNode;\n}\n\nfunction AccordionDetails({ title, content, children }: AccordionDetailsProps) {\n return (\n <Box padding={1} background=\"primary100\">\n <Accordion.Root size=\"S\">\n <Accordion.Item value=\"acc-1\">\n <Accordion.Header>\n <Accordion.Trigger>{title}</Accordion.Trigger>\n </Accordion.Header>\n <Accordion.Content>\n <Box padding={3}>\n <Typography>{content}</Typography>\n {children && <Box padding={1}>{children}</Box>}\n </Box>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Box>\n );\n}\n\ninterface ShowResponseProps {\n data: QueryResponse[];\n onNavigate: (id: string) => void;\n}\n\nfunction ShowResponse({ data, onNavigate }: ShowResponseProps) {\n return (\n <>\n {data.map((item, index) => (\n <Box key={index} marginBottom={4}>\n <Box padding={1}>\n <Markdown>{item.text}</Markdown>\n </Box>\n\n {item.sourceDocuments?.length > 0 &&\n item.sourceDocuments.map((doc, docIndex) => (\n <AccordionDetails\n key={docIndex}\n title=\"Original Source Document\"\n content={<Markdown>{doc.pageContent}</Markdown>}\n >\n <Link\n onClick={() => onNavigate(doc.metadata.id)}\n style={{ cursor: \"pointer\" }}\n >\n View Source for {doc.metadata.title}\n </Link>\n </AccordionDetails>\n ))}\n </Box>\n ))}\n </>\n );\n}\n\nexport function ChatModal() {\n const { get } = useFetchClient();\n const containerRef = useRef<HTMLDivElement>(null);\n const navigate = useNavigate();\n\n const [isVisible, setIsVisible] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [data, setData] = useState<QueryResponse[]>([]);\n\n useEffect(() => {\n if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n }, [data]);\n\n function handleNavigate(id: string) {\n setIsVisible(false);\n navigate(`/plugins/${PLUGIN_ID}/embeddings/${id}`);\n }\n\n async function handleQueryEmbeddings(e: React.FormEvent) {\n e.preventDefault();\n if (!inputValue.trim() || isLoading) return;\n\n setIsLoading(true);\n try {\n const response = await get(\n `/${PLUGIN_ID}/embeddings/embeddings-query?${qs.stringify({\n query: inputValue,\n })}`\n );\n if (response.data && !response.data.error) {\n setData((prev) => [...prev, response.data as QueryResponse]);\n }\n setInputValue(\"\");\n } catch (error) {\n console.error(\"Query failed:\", error);\n } finally {\n setIsLoading(false);\n }\n }\n\n return (\n <>\n <StyledButton onClick={() => setIsVisible(true)} aria-label=\"Open chat\">\n <RobotIcon height={28} width={28} />\n </StyledButton>\n\n <Modal.Root open={isVisible} onOpenChange={setIsVisible}>\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>Chat With Your Data</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {data.length > 0 && (\n <Box padding={1} marginBottom={4}>\n <ResponseContainer ref={containerRef}>\n <ShowResponse data={data} onNavigate={handleNavigate} />\n </ResponseContainer>\n </Box>\n )}\n <Box padding={1}>\n <form onSubmit={handleQueryEmbeddings}>\n <TextInput\n placeholder=\"Enter your question\"\n type=\"text\"\n aria-label=\"Question\"\n name=\"question\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setInputValue(e.target.value)\n }\n value={inputValue}\n />\n </form>\n </Box>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\">Cancel</Button>\n </Modal.Close>\n <Button\n onClick={handleQueryEmbeddings}\n disabled={!inputValue.trim() || isLoading}\n loading={isLoading}\n >\n {isLoading ? \"Sending...\" : \"Send\"}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n </>\n );\n}\n","import { PLUGIN_ID } from \"../pluginId\";\nimport qs from \"qs\";\n\nconst API_BASE = `/${PLUGIN_ID}/embeddings`;\nconst SYNC_BASE = `/${PLUGIN_ID}`;\n\ninterface CreateEmbeddingData {\n title: string;\n content: string;\n collectionType?: string;\n fieldName?: string;\n related?: {\n __type: string;\n id: number;\n };\n}\n\ninterface EmbeddingsListParams {\n page?: number;\n pageSize?: number;\n filters?: Record<string, any>;\n}\n\nexport const embeddingsApi = {\n create: async (\n fetchClient: { post: Function },\n data: CreateEmbeddingData\n ) => {\n const response = await fetchClient.post(`${API_BASE}/create-embedding`, {\n data,\n });\n return response.data;\n },\n\n delete: async (fetchClient: { del: Function }, id: string) => {\n const response = await fetchClient.del(`${API_BASE}/delete-embedding/${id}`);\n return response.data;\n },\n\n getOne: async (fetchClient: { get: Function }, id: string) => {\n const response = await fetchClient.get(`${API_BASE}/find/${id}`);\n return response.data;\n },\n\n getAll: async (\n fetchClient: { get: Function },\n params?: EmbeddingsListParams\n ) => {\n const queryString = params ? `?${qs.stringify(params)}` : \"\";\n const response = await fetchClient.get(`${API_BASE}/find${queryString}`);\n return response.data;\n },\n\n query: async (fetchClient: { get: Function }, query: string) => {\n const response = await fetchClient.get(\n `${API_BASE}/embeddings-query?${qs.stringify({ query })}`\n );\n return response.data;\n },\n};\n\nexport interface SyncStatus {\n neonCount: number;\n strapiCount: number;\n inSync: boolean;\n missingInStrapi: number;\n missingInNeon: number;\n contentDifferences: number;\n}\n\nexport interface SyncResult {\n success: boolean;\n timestamp: string;\n dryRun?: boolean;\n neonCount: number;\n strapiCount: number;\n actions: {\n created: number;\n updated: number;\n orphansRemoved: number;\n };\n details: {\n created: string[];\n updated: string[];\n orphansRemoved: string[];\n };\n errors: string[];\n}\n\nexport interface RecreateResult {\n success: boolean;\n message: string;\n totalProcessed: number;\n created: number;\n failed: number;\n errors: string[];\n}\n\nexport const syncApi = {\n getStatus: async (fetchClient: { get: Function }): Promise<SyncStatus> => {\n const response = await fetchClient.get(`${SYNC_BASE}/sync/status`);\n return response.data;\n },\n\n syncFromNeon: async (\n fetchClient: { post: Function },\n options?: { removeOrphans?: boolean; dryRun?: boolean }\n ): Promise<SyncResult> => {\n const queryString = options ? `?${qs.stringify(options)}` : \"\";\n const response = await fetchClient.post(`${SYNC_BASE}/sync${queryString}`);\n return response.data;\n },\n\n recreateAll: async (fetchClient: { post: Function }): Promise<RecreateResult> => {\n const response = await fetchClient.post(`${SYNC_BASE}/recreate`);\n return response.data;\n },\n};\n","import React, { useState, useEffect } from 'react';\nimport {\n Modal,\n Button,\n Flex,\n Typography,\n Box,\n Loader,\n Badge,\n Divider,\n SingleSelect,\n SingleSelectOption,\n Checkbox,\n Alert,\n Card,\n Grid,\n} from '@strapi/design-system';\nimport { ArrowClockwise, Check, Cross, WarningCircle, Database } from '@strapi/icons';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport { syncApi, SyncStatus, SyncResult, RecreateResult } from '../../utils/api';\n\ntype SyncOperation = 'status' | 'sync' | 'recreate';\n\ninterface SyncModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSyncComplete?: () => void;\n}\n\ninterface StatCardProps {\n label: string;\n value: number | string;\n subtitle?: string;\n variant?: 'default' | 'success' | 'warning' | 'danger';\n}\n\nfunction StatCard({ label, value, subtitle, variant = 'default' }: StatCardProps) {\n const bgColors = {\n default: 'neutral100',\n success: 'success100',\n warning: 'warning100',\n danger: 'danger100',\n };\n\n const textColors = {\n default: 'neutral800',\n success: 'success700',\n warning: 'warning700',\n danger: 'danger700',\n };\n\n return (\n <Box\n padding={4}\n background={bgColors[variant]}\n hasRadius\n borderColor=\"neutral200\"\n style={{ textAlign: 'center', minWidth: '120px' }}\n >\n <Typography variant=\"pi\" textColor=\"neutral600\" style={{ textTransform: 'uppercase', fontSize: '11px' }}>\n {label}\n </Typography>\n <Box paddingTop={1}>\n <Typography variant=\"alpha\" textColor={textColors[variant]} fontWeight=\"bold\">\n {value}\n </Typography>\n </Box>\n {subtitle && (\n <Box paddingTop={1}>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {subtitle}\n </Typography>\n </Box>\n )}\n </Box>\n );\n}\n\nexport function SyncModal({ isOpen, onClose, onSyncComplete }: SyncModalProps) {\n const fetchClient = useFetchClient();\n\n const [operation, setOperation] = useState<SyncOperation>('status');\n const [removeOrphans, setRemoveOrphans] = useState(false);\n const [dryRun, setDryRun] = useState(true);\n const [isLoading, setIsLoading] = useState(false);\n const [status, setStatus] = useState<SyncStatus | null>(null);\n const [syncResult, setSyncResult] = useState<SyncResult | null>(null);\n const [recreateResult, setRecreateResult] = useState<RecreateResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (isOpen) {\n fetchStatus();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n setSyncResult(null);\n setRecreateResult(null);\n setError(null);\n setOperation('status');\n setDryRun(true);\n setRemoveOrphans(false);\n }\n }, [isOpen]);\n\n const fetchStatus = async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await syncApi.getStatus(fetchClient);\n setStatus(result);\n } catch (err: any) {\n setError(err.message || 'Failed to fetch sync status');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleExecute = async () => {\n setIsLoading(true);\n setError(null);\n setSyncResult(null);\n setRecreateResult(null);\n\n try {\n if (operation === 'status') {\n await fetchStatus();\n } else if (operation === 'sync') {\n const result = await syncApi.syncFromNeon(fetchClient, { removeOrphans, dryRun });\n setSyncResult(result);\n if (!dryRun && onSyncComplete) {\n onSyncComplete();\n }\n } else if (operation === 'recreate') {\n const result = await syncApi.recreateAll(fetchClient);\n setRecreateResult(result);\n if (onSyncComplete) {\n onSyncComplete();\n }\n }\n } catch (err: any) {\n setError(err.message || 'Operation failed');\n } finally {\n setIsLoading(false);\n }\n };\n\n const renderStatus = () => {\n if (!status) return null;\n\n return (\n <Card padding={5} background=\"neutral0\" shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Flex gap={2} alignItems=\"center\">\n <Database />\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Sync Status\n </Typography>\n </Flex>\n <Badge active={status.inSync} size=\"S\">\n {status.inSync ? 'In Sync' : 'Out of Sync'}\n </Badge>\n </Flex>\n\n <Divider />\n\n <Flex gap={4} justifyContent=\"center\" wrap=\"wrap\">\n <StatCard\n label=\"Neon DB\"\n value={status.neonCount}\n subtitle=\"embeddings\"\n />\n <StatCard\n label=\"Strapi DB\"\n value={status.strapiCount}\n subtitle=\"embeddings\"\n />\n </Flex>\n\n {!status.inSync && (\n <>\n <Divider />\n <Box padding={3} background=\"warning100\" hasRadius>\n <Flex direction=\"column\" gap={2}>\n <Typography variant=\"sigma\" textColor=\"warning700\">\n Differences Found\n </Typography>\n {status.missingInStrapi > 0 && (\n <Typography variant=\"pi\" textColor=\"warning700\">\n • {status.missingInStrapi} embeddings missing in Strapi (will be created)\n </Typography>\n )}\n {status.missingInNeon > 0 && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n • {status.missingInNeon} orphaned entries in Strapi (not in Neon)\n </Typography>\n )}\n {status.contentDifferences > 0 && (\n <Typography variant=\"pi\" textColor=\"warning700\">\n • {status.contentDifferences} entries with content differences\n </Typography>\n )}\n </Flex>\n </Box>\n </>\n )}\n </Flex>\n </Card>\n );\n };\n\n const renderSyncResult = () => {\n if (!syncResult) return null;\n\n return (\n <Card padding={5} background={syncResult.success ? 'success100' : 'danger100'} shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"delta\" fontWeight=\"bold\">\n {syncResult.dryRun ? 'Preview Results' : 'Sync Results'}\n </Typography>\n <Badge active={syncResult.success}>\n {syncResult.success ? (\n <Flex gap={1} alignItems=\"center\">\n <Check width={12} height={12} />\n Success\n </Flex>\n ) : (\n <Flex gap={1} alignItems=\"center\">\n <Cross width={12} height={12} />\n Failed\n </Flex>\n )}\n </Badge>\n </Flex>\n\n <Divider />\n\n <Flex gap={3} justifyContent=\"center\" wrap=\"wrap\">\n <StatCard\n label=\"Created\"\n value={syncResult.actions.created}\n variant={syncResult.actions.created > 0 ? 'success' : 'default'}\n />\n <StatCard\n label=\"Updated\"\n value={syncResult.actions.updated}\n variant={syncResult.actions.updated > 0 ? 'warning' : 'default'}\n />\n <StatCard\n label=\"Removed\"\n value={syncResult.actions.orphansRemoved}\n variant={syncResult.actions.orphansRemoved > 0 ? 'danger' : 'default'}\n />\n </Flex>\n\n {syncResult.errors.length > 0 && (\n <Box padding={3} background=\"danger100\" hasRadius>\n <Typography variant=\"sigma\" textColor=\"danger700\">\n Errors\n </Typography>\n <Box paddingTop={2}>\n {syncResult.errors.slice(0, 3).map((err, i) => (\n <Typography key={i} variant=\"pi\" textColor=\"danger600\">\n • {err}\n </Typography>\n ))}\n {syncResult.errors.length > 3 && (\n <Typography variant=\"pi\" textColor=\"danger600\" fontWeight=\"bold\">\n + {syncResult.errors.length - 3} more errors\n </Typography>\n )}\n </Box>\n </Box>\n )}\n\n {syncResult.dryRun && (\n <Box paddingTop={2}>\n <Alert variant=\"default\" closeLabel=\"Close\">\n This was a preview. No changes were made. Click \"Apply Changes\" below to execute the sync.\n </Alert>\n </Box>\n )}\n </Flex>\n </Card>\n );\n };\n\n const renderRecreateResult = () => {\n if (!recreateResult) return null;\n\n return (\n <Card padding={5} background={recreateResult.success ? 'success100' : 'danger100'} shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Recreate Results\n </Typography>\n <Badge active={recreateResult.success}>\n {recreateResult.success ? 'Success' : 'Failed'}\n </Badge>\n </Flex>\n\n <Divider />\n\n <Flex gap={3} justifyContent=\"center\" wrap=\"wrap\">\n <StatCard\n label=\"Processed\"\n value={recreateResult.totalProcessed}\n />\n <StatCard\n label=\"Created\"\n value={recreateResult.created}\n variant=\"success\"\n />\n <StatCard\n label=\"Failed\"\n value={recreateResult.failed}\n variant={recreateResult.failed > 0 ? 'danger' : 'default'}\n />\n </Flex>\n\n {recreateResult.errors.length > 0 && (\n <Box padding={3} background=\"danger100\" hasRadius>\n <Typography variant=\"sigma\" textColor=\"danger700\">\n Errors\n </Typography>\n <Box paddingTop={2}>\n {recreateResult.errors.slice(0, 3).map((err, i) => (\n <Typography key={i} variant=\"pi\" textColor=\"danger600\">\n • {err}\n </Typography>\n ))}\n </Box>\n </Box>\n )}\n </Flex>\n </Card>\n );\n };\n\n const getButtonLabel = () => {\n if (operation === 'status') return 'Refresh Status';\n if (operation === 'sync') return dryRun ? 'Preview Sync' : 'Run Sync';\n if (operation === 'recreate') return 'Recreate All';\n return 'Execute';\n };\n\n const handleApplyChanges = async () => {\n setIsLoading(true);\n setError(null);\n setSyncResult(null);\n\n try {\n const result = await syncApi.syncFromNeon(fetchClient, { removeOrphans, dryRun: false });\n setSyncResult(result);\n if (onSyncComplete) {\n onSyncComplete();\n }\n } catch (err: any) {\n setError(err.message || 'Failed to apply changes');\n } finally {\n setIsLoading(false);\n }\n };\n\n const showApplyButton = syncResult?.dryRun && syncResult?.success;\n\n return (\n <Modal.Root open={isOpen} onOpenChange={(open: boolean) => !open && onClose()}>\n <Modal.Content>\n <Modal.Header>\n <Flex gap={2} alignItems=\"center\">\n <ArrowClockwise />\n <Modal.Title>Database Sync</Modal.Title>\n </Flex>\n </Modal.Header>\n\n <Modal.Body>\n <Flex direction=\"column\" gap={5}>\n {error && (\n <Alert variant=\"danger\" closeLabel=\"Close\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n {isLoading && !status ? (\n <Flex justifyContent=\"center\" padding={6}>\n <Loader>Loading status...</Loader>\n </Flex>\n ) : (\n renderStatus()\n )}\n\n <Card padding={5} background=\"neutral0\" shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Select Operation\n </Typography>\n\n <SingleSelect\n value={operation}\n onChange={(value: string) => setOperation(value as SyncOperation)}\n disabled={isLoading}\n size=\"M\"\n >\n <SingleSelectOption value=\"status\">\n Check Status\n </SingleSelectOption>\n <SingleSelectOption value=\"sync\">\n Sync from Neon\n </SingleSelectOption>\n <SingleSelectOption value=\"recreate\">\n Recreate All (Danger)\n </SingleSelectOption>\n </SingleSelect>\n\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {operation === 'status' && 'Compare Neon and Strapi databases without making changes.'}\n {operation === 'sync' && 'Import embeddings from Neon DB to Strapi. Use this to restore missing entries.'}\n {operation === 'recreate' && 'Delete all Neon embeddings and recreate them from Strapi data.'}\n </Typography>\n </Flex>\n </Card>\n\n {operation === 'sync' && (\n <Card padding={5} background=\"neutral0\" shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Sync Options\n </Typography>\n <Flex direction=\"column\" gap={3}>\n <Checkbox\n checked={dryRun}\n onCheckedChange={(checked: boolean) => setDryRun(checked)}\n >\n <Flex direction=\"column\">\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n Dry Run\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Preview changes without applying them\n </Typography>\n </Flex>\n </Checkbox>\n <Checkbox\n checked={removeOrphans}\n onCheckedChange={(checked: boolean) => setRemoveOrphans(checked)}\n >\n <Flex direction=\"column\">\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n Remove Orphans\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Delete Strapi entries that don't exist in Neon\n </Typography>\n </Flex>\n </Checkbox>\n </Flex>\n </Flex>\n </Card>\n )}\n\n {operation === 'recreate' && (\n <Alert variant=\"danger\" closeLabel=\"Close\">\n <Flex direction=\"column\" gap={2}>\n <Flex gap={2} alignItems=\"center\">\n <WarningCircle />\n <Typography variant=\"omega\" fontWeight=\"bold\">\n Destructive Operation\n </Typography>\n </Flex>\n <Typography variant=\"pi\">\n This will delete ALL embeddings in Neon and recreate them from Strapi data.\n This operation cannot be undone. Only use if embeddings are corrupted.\n </Typography>\n </Flex>\n </Alert>\n )}\n\n {syncResult && renderSyncResult()}\n {recreateResult && renderRecreateResult()}\n </Flex>\n </Modal.Body>\n\n <Modal.Footer>\n <Flex justifyContent=\"space-between\" width=\"100%\">\n <Modal.Close>\n <Button variant=\"tertiary\">Cancel</Button>\n </Modal.Close>\n <Flex gap={2}>\n {showApplyButton && (\n <Button\n onClick={handleApplyChanges}\n loading={isLoading}\n startIcon={<Check />}\n variant=\"success\"\n >\n Apply Changes\n </Button>\n )}\n <Button\n onClick={handleExecute}\n loading={isLoading}\n startIcon={<ArrowClockwise />}\n variant={operation === 'recreate' ? 'danger' : 'secondary'}\n >\n {getButtonLabel()}\n </Button>\n </Flex>\n </Flex>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n}\n","import React, { useEffect, useState, useCallback, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Main,\n Box,\n Button,\n TextInput,\n Flex,\n Loader,\n Typography,\n Pagination,\n PreviousLink,\n PageLink,\n NextLink,\n} from '@strapi/design-system';\nimport { Plus, Search, ArrowClockwise } from '@strapi/icons';\nimport { useFetchClient, Layouts } from '@strapi/strapi/admin';\nimport qs from 'qs';\n\nimport { PLUGIN_ID } from '../pluginId';\nimport { EmptyState } from '../components/custom/EmptyState';\nimport { EmbeddingsTable } from '../components/custom/EmbeddingsTable';\nimport { ChatModal } from '../components/custom/ChatModal';\nimport { SyncModal } from '../components/custom/SyncModal';\n\ninterface Embedding {\n id: number;\n documentId: string;\n title: string;\n content?: string;\n embeddingsId?: string;\n}\n\ninterface EmbeddingsResponse {\n data: Embedding[];\n count: number;\n totalCount: number;\n}\n\nconst PAGE_SIZE = 10;\n\nfunction debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\nexport function HomePage() {\n const { get } = useFetchClient();\n const navigate = useNavigate();\n\n const [embeddings, setEmbeddings] = useState<EmbeddingsResponse | null>(null);\n const [search, setSearch] = useState('');\n const [isLoading, setIsLoading] = useState(true);\n const [currentPage, setCurrentPage] = useState(1);\n const [isSyncModalOpen, setIsSyncModalOpen] = useState(false);\n\n const totalPages = embeddings ? Math.ceil(embeddings.totalCount / PAGE_SIZE) : 0;\n\n const buildQuery = (searchTerm: string, page: number) =>\n qs.stringify({\n page,\n pageSize: PAGE_SIZE,\n filters: searchTerm\n ? {\n $or: [{ title: { $containsi: searchTerm } }, { content: { $containsi: searchTerm } }],\n }\n : undefined,\n });\n\n const fetchData = useCallback(\n async (searchTerm: string, page: number) => {\n setIsLoading(true);\n try {\n const response = await get(`/${PLUGIN_ID}/embeddings/find?${buildQuery(searchTerm, page)}`);\n setEmbeddings(response.data as EmbeddingsResponse);\n } catch (error) {\n console.error('Failed to fetch embeddings:', error);\n setEmbeddings({ data: [], count: 0, totalCount: 0 });\n } finally {\n setIsLoading(false);\n }\n },\n [get]\n );\n\n const debouncedFetch = useMemo(() => debounce(fetchData, 500), [fetchData]);\n\n useEffect(() => {\n debouncedFetch(search, currentPage);\n }, [search, currentPage, debouncedFetch]);\n\n // Reset to page 1 when search changes\n useEffect(() => {\n setCurrentPage(1);\n }, [search]);\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n };\n\n const handleCreateNew = () => {\n navigate(`/plugins/${PLUGIN_ID}/embeddings`);\n };\n\n const handleSyncComplete = () => {\n // Refresh the embeddings list after sync\n fetchData(search, currentPage);\n };\n\n const headerActions = (\n <Flex gap={2}>\n <Button variant=\"secondary\" startIcon={<ArrowClockwise />} onClick={() => setIsSyncModalOpen(true)}>\n Sync\n </Button>\n <Button startIcon={<Plus />} onClick={handleCreateNew}>\n Create new embedding\n </Button>\n </Flex>\n );\n\n if (isLoading && !embeddings) {\n return (\n <Main>\n <Layouts.Header\n title={'Content Embeddings'}\n subtitle={'Manage your content embeddings'}\n primaryAction={headerActions}\n />\n <Layouts.Content>\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>Loading...</Loader>\n </Flex>\n </Layouts.Content>\n <ChatModal />\n <SyncModal\n isOpen={isSyncModalOpen}\n onClose={() => setIsSyncModalOpen(false)}\n onSyncComplete={handleSyncComplete}\n />\n </Main>\n );\n }\n\n if (embeddings?.totalCount === 0 && !search) {\n return (\n <Main>\n <Layouts.Header\n title={'Content Embeddings'}\n subtitle={'Manage your content embeddings'}\n primaryAction={headerActions}\n />\n <Layouts.Content>\n <EmptyState />\n </Layouts.Content>\n <ChatModal />\n <SyncModal\n isOpen={isSyncModalOpen}\n onClose={() => setIsSyncModalOpen(false)}\n onSyncComplete={handleSyncComplete}\n />\n </Main>\n );\n }\n\n // Render embeddings content based on loading state and data\n const renderEmbeddingsContent = () => {\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>Loading...</Loader>\n </Flex>\n );\n }\n\n if (embeddings?.data && embeddings.data.length > 0) {\n return <EmbeddingsTable data={embeddings.data} />;\n }\n\n return (\n <Box padding={8} textAlign=\"center\">\n No embeddings found matching \"{search}\"\n </Box>\n );\n };\n\n // Check if pagination should be shown\n const shouldShowPagination = embeddings && embeddings.totalCount > 0 && totalPages > 1;\n\n // Get visible page numbers for pagination\n const getVisiblePages = (): number[] => {\n const pages: number[] = [];\n const maxVisible = 5;\n\n let start = Math.max(1, currentPage - Math.floor(maxVisible / 2));\n const end = Math.min(totalPages, start + maxVisible - 1);\n\n if (end - start + 1 < maxVisible) {\n start = Math.max(1, end - maxVisible + 1);\n }\n\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n return pages;\n };\n\n // Render pagination info and controls\n const renderPagination = () => {\n if (!shouldShowPagination || !embeddings) {\n return null;\n }\n\n const startItem = (currentPage - 1) * PAGE_SIZE + 1;\n const endItem = Math.min(currentPage * PAGE_SIZE, embeddings.totalCount);\n const visiblePages = getVisiblePages();\n\n return (\n <Flex direction=\"column\" alignItems=\"center\" gap={3} paddingTop={6}>\n <Pagination activePage={currentPage} pageCount={totalPages}>\n <PreviousLink\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n disabled={currentPage === 1}\n >\n Previous\n </PreviousLink>\n {visiblePages.map((page) => (\n <PageLink\n key={page}\n number={page}\n onClick={() => setCurrentPage(page)}\n >\n {page}\n </PageLink>\n ))}\n <NextLink\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\n disabled={currentPage === totalPages}\n >\n Next\n </NextLink>\n </Pagination>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Showing {startItem} to {endItem} of {embeddings.totalCount} entries\n </Typography>\n </Flex>\n );\n };\n\n return (\n <Main>\n <Layouts.Header\n title={'Content Embeddings'}\n subtitle={`${embeddings?.totalCount || 0} embeddings total`}\n primaryAction={headerActions}\n />\n <Layouts.Content>\n <Box paddingBottom={4}>\n <TextInput\n placeholder=\"Search embeddings...\"\n name=\"search\"\n value={search}\n onChange={handleSearchChange}\n startAction={<Search />}\n />\n </Box>\n {renderEmbeddingsContent()}\n {renderPagination()}\n </Layouts.Content>\n <ChatModal />\n <SyncModal\n isOpen={isSyncModalOpen}\n onClose={() => setIsSyncModalOpen(false)}\n onSyncComplete={handleSyncComplete}\n />\n </Main>\n );\n}\n","import React from 'react';\nimport { Box, Field, TextInput, Textarea } from '@strapi/design-system';\nimport { MarkdownEditor } from '../custom/MarkdownEditor';\n\ninterface CreateEmbeddingsFormProps {\n onSubmit: (e: React.FormEvent<HTMLFormElement>) => void;\n isLoading: boolean;\n input: string;\n setInput: (input: string) => void;\n markdown: string;\n handleMarkdownChange: React.Dispatch<React.SetStateAction<string>>;\n metadata: string;\n setMetadata: (metadata: string) => void;\n height?: number;\n children?: React.ReactNode;\n}\n\nexport function CreateEmbeddingsForm({\n onSubmit,\n isLoading,\n input,\n setInput,\n markdown,\n handleMarkdownChange,\n metadata,\n setMetadata,\n height,\n children,\n}: CreateEmbeddingsFormProps) {\n return (\n <form onSubmit={onSubmit}>\n <fieldset disabled={isLoading} style={{ border: 'none', padding: 0, margin: 0 }}>\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Title</Field.Label>\n <TextInput\n placeholder=\"Enter a title for your embedding\"\n name=\"input\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setInput(e.target.value)}\n value={input}\n />\n </Field.Root>\n </Box>\n\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Content</Field.Label>\n <MarkdownEditor\n content={markdown}\n onChange={handleMarkdownChange}\n height={height}\n />\n </Field.Root>\n </Box>\n\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Metadata (JSON)</Field.Label>\n <Field.Hint>Optional JSON metadata for this embedding</Field.Hint>\n <Textarea\n placeholder='{\"category\": \"docs\", \"source\": \"manual\"}'\n name=\"metadata\"\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => setMetadata(e.target.value)}\n value={metadata}\n />\n </Field.Root>\n </Box>\n\n {children}\n </fieldset>\n </form>\n );\n}\n","import { Link } from \"@strapi/design-system\";\nimport { ArrowLeft } from \"@strapi/icons\";\nimport { NavLink } from \"react-router-dom\";\n\ninterface BackLinkProps {\n to?: string;\n}\n\nexport function BackLink({ to }: BackLinkProps) {\n if (to) {\n return (\n <Link tag={NavLink} to={to} startIcon={<ArrowLeft />}>\n Go back\n </Link>\n );\n }\n\n return (\n <Link tag={NavLink} to=\"..\" relative=\"path\" startIcon={<ArrowLeft />}>\n Go back\n </Link>\n );\n}\n\nexport default BackLink;\n","import React, { useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useIntl } from \"react-intl\";\nimport { Main, Box, Button } from \"@strapi/design-system\";\nimport { useFetchClient, Layouts } from \"@strapi/strapi/admin\";\n\nimport { PLUGIN_ID } from \"../pluginId\";\nimport { CreateEmbeddingsForm } from \"../components/forms/CreateEmbeddingForm\";\nimport { BackLink } from \"../components/custom/BackLink\";\n\nconst CHUNK_SIZE = 4000; // Content over this will be auto-chunked\n\nexport default function CreateEmbeddings() {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { post } = useFetchClient();\n\n const [isLoading, setIsLoading] = useState(false);\n const [title, setTitle] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [metadata, setMetadata] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const isValid = title.trim() && content.trim();\n const contentLength = content.length;\n const willChunk = contentLength > CHUNK_SIZE;\n const estimatedChunks = willChunk ? Math.ceil(contentLength / (CHUNK_SIZE - 200)) : 1;\n\n function parseMetadata(): Record<string, any> | null {\n if (!metadata.trim()) return null;\n try {\n return JSON.parse(metadata);\n } catch {\n return null;\n }\n }\n\n async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n e.stopPropagation();\n\n if (!isValid) {\n setError(\"Please provide a title and content\");\n return;\n }\n\n // Validate metadata JSON if provided\n if (metadata.trim()) {\n const parsedMetadata = parseMetadata();\n if (parsedMetadata === null) {\n setError(\"Invalid JSON in metadata field\");\n return;\n }\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await post(`/${PLUGIN_ID}/embeddings/create-embedding`, {\n data: {\n title: title.trim(),\n content: content.trim(),\n metadata: parseMetadata(),\n },\n });\n navigate(`/plugins/${PLUGIN_ID}`);\n } catch (err: any) {\n console.error(\"Failed to create embedding:\", err);\n setError(err.message || \"Failed to create embedding. Please try again.\");\n setIsLoading(false);\n }\n }\n\n return (\n <Main>\n <Layouts.Header\n title={formatMessage({\n id: \"CreateEmbeddings.header.title\",\n defaultMessage: \"Create Embedding\",\n })}\n subtitle={\n willChunk\n ? formatMessage(\n {\n id: \"CreateEmbeddings.header.subtitle.chunked\",\n defaultMessage: \"Content: {length} characters (will create ~{chunks} embeddings)\",\n },\n { length: contentLength, chunks: estimatedChunks }\n )\n : formatMessage(\n {\n id: \"CreateEmbeddings.header.subtitle\",\n defaultMessage: \"Content: {length} characters\",\n },\n { length: contentLength }\n )\n }\n primaryAction={\n <Button\n type=\"submit\"\n disabled={isLoading || !isValid}\n loading={isLoading}\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n const form = document.querySelector(\"form\");\n if (form) {\n form.dispatchEvent(\n new Event(\"submit\", { cancelable: true, bubbles: true })\n );\n }\n }}\n >\n {isLoading ? \"Creating...\" : \"Create Embedding\"}\n </Button>\n }\n navigationAction={<BackLink to={`/plugins/${PLUGIN_ID}`} />}\n />\n <Layouts.Content>\n <Box>\n {error && (\n <Box\n padding={4}\n marginBottom={4}\n background=\"danger100\"\n borderColor=\"danger600\"\n hasRadius\n >\n {error}\n </Box>\n )}\n <CreateEmbeddingsForm\n onSubmit={handleSubmit}\n isLoading={isLoading}\n input={title}\n setInput={setTitle}\n markdown={content}\n handleMarkdownChange={setContent}\n metadata={metadata}\n setMetadata={setMetadata}\n />\n </Box>\n </Layouts.Content>\n </Main>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport {\n Main,\n Box,\n Flex,\n Button,\n Typography,\n Grid,\n Dialog,\n Loader,\n Field,\n TextInput,\n Textarea,\n Badge,\n} from \"@strapi/design-system\";\nimport { Trash, Pencil, Check, Cross } from \"@strapi/icons\";\nimport { useFetchClient, Layouts, useNotification } from \"@strapi/strapi/admin\";\n\nimport { PLUGIN_ID } from \"../pluginId\";\nimport { BackLink } from \"../components/custom/BackLink\";\nimport { Markdown } from \"../components/custom/Markdown\";\nimport { MarkdownEditor } from \"../components/custom/MarkdownEditor\";\n\nconst StyledTypography = styled(Typography)`\n display: block;\n margin-bottom: 1rem;\n`;\n\nconst ChunkTab = styled.div<{ $isActive: boolean }>`\n padding: 0.5rem 1rem;\n cursor: pointer;\n border-bottom: 2px solid ${({ $isActive }) => ($isActive ? '#4945ff' : 'transparent')};\n color: ${({ $isActive }) => ($isActive ? '#4945ff' : 'inherit')};\n font-weight: ${({ $isActive }) => ($isActive ? '600' : '400')};\n white-space: nowrap;\n\n &:hover {\n color: #4945ff;\n }\n`;\n\nconst ChunkTabsContainer = styled(Flex)`\n border-bottom: 1px solid #dcdce4;\n overflow-x: auto;\n margin-bottom: 1rem;\n`;\n\ninterface EmbeddingData {\n id: number;\n documentId: string;\n title: string;\n content?: string;\n embeddingId?: string;\n embedding?: number[];\n collectionType?: string;\n fieldName?: string;\n metadata?: Record<string, any>;\n}\n\ninterface MetadataProps {\n data: EmbeddingData;\n}\n\nfunction Metadata({ data }: Readonly<MetadataProps>) {\n const metadata = {\n id: data.documentId,\n title: data.title,\n collectionType: data.collectionType || \"standalone\",\n fieldName: data.fieldName || \"content\",\n embeddingId: data.embeddingId || \"N/A\",\n vectorDimensions: data.embedding?.length || 0,\n };\n\n return (\n <Box padding={4} background=\"neutral0\" hasRadius>\n <StyledTypography variant=\"beta\">Metadata</StyledTypography>\n {Object.entries(metadata).map(([key, value]) => (\n <Box key={key} padding={1}>\n <Typography>\n <strong>{key}:</strong> {String(value)}\n </Typography>\n </Box>\n ))}\n {data.metadata && (\n <Box marginTop={4}>\n <Typography variant=\"sigma\">Custom Metadata</Typography>\n <Box padding={2} background=\"neutral100\" hasRadius marginTop={2}>\n <pre style={{ fontSize: \"12px\", margin: 0, whiteSpace: \"pre-wrap\" }}>\n {JSON.stringify(data.metadata, null, 2)}\n </pre>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n\ninterface ConfirmDeleteProps {\n onConfirm: () => void;\n isLoading: boolean;\n}\n\nfunction ConfirmDeleteEmbedding({ onConfirm, isLoading }: Readonly<ConfirmDeleteProps>) {\n return (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" startIcon={<Trash />}>\n Delete\n </Button>\n </Dialog.Trigger>\n <Dialog.Content>\n <Dialog.Header>Confirm Deletion</Dialog.Header>\n <Dialog.Body>\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <Typography>Are you sure you want to delete this embedding?</Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n This action cannot be undone.\n </Typography>\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\">Cancel</Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button\n variant=\"danger\"\n onClick={onConfirm}\n startIcon={<Trash />}\n loading={isLoading}\n >\n {isLoading ? \"Deleting...\" : \"Delete\"}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nexport default function EmbeddingDetails() {\n const navigate = useNavigate();\n const { id } = useParams<{ id: string }>();\n const { del, get, put } = useFetchClient();\n const { toggleNotification } = useNotification();\n\n const [data, setData] = useState<EmbeddingData | null>(null);\n const [chunks, setChunks] = useState<EmbeddingData[]>([]);\n const [activeChunkIndex, setActiveChunkIndex] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n\n // Edit form state\n const [editTitle, setEditTitle] = useState(\"\");\n const [editContent, setEditContent] = useState(\"\");\n const [editMetadata, setEditMetadata] = useState(\"\");\n\n // Check if this is a chunked document\n const isChunkedDocument = chunks.length > 1;\n const activeChunk = isChunkedDocument ? chunks[activeChunkIndex] : data;\n\n useEffect(() => {\n async function fetchData() {\n if (!id) return;\n try {\n // First fetch the main embedding\n const response = await get(`/${PLUGIN_ID}/embeddings/find/${id}`);\n const embeddingData = response.data as EmbeddingData;\n setData(embeddingData);\n\n // Check if this is part of a chunked document and fetch related chunks\n const chunksResponse = await get(`/${PLUGIN_ID}/embeddings/related-chunks/${id}`);\n const relatedChunks = chunksResponse.data?.data || [];\n\n if (relatedChunks.length > 1) {\n // Sort chunks by chunkIndex\n const sortedChunks = relatedChunks.sort((a: EmbeddingData, b: EmbeddingData) => {\n const aIndex = (a.metadata as any)?.chunkIndex ?? 0;\n const bIndex = (b.metadata as any)?.chunkIndex ?? 0;\n return aIndex - bIndex;\n });\n setChunks(sortedChunks);\n\n // Find the index of the current chunk\n const currentIndex = sortedChunks.findIndex(\n (chunk: EmbeddingData) => chunk.documentId === id\n );\n if (currentIndex >= 0) {\n setActiveChunkIndex(currentIndex);\n }\n\n // Initialize edit form with first chunk\n const firstChunk = sortedChunks[currentIndex >= 0 ? currentIndex : 0];\n setEditTitle(firstChunk.title || \"\");\n setEditContent(firstChunk.content || \"\");\n setEditMetadata(firstChunk.metadata ? JSON.stringify(firstChunk.metadata, null, 2) : \"\");\n } else {\n setChunks([embeddingData]);\n // Initialize edit form\n setEditTitle(embeddingData.title || \"\");\n setEditContent(embeddingData.content || \"\");\n setEditMetadata(embeddingData.metadata ? JSON.stringify(embeddingData.metadata, null, 2) : \"\");\n }\n } catch (error) {\n console.error(\"Failed to fetch embedding:\", error);\n } finally {\n setIsLoading(false);\n }\n }\n fetchData();\n }, [id, get]);\n\n // Update edit form when active chunk changes\n useEffect(() => {\n if (activeChunk && !isEditing) {\n setEditTitle(activeChunk.title || \"\");\n setEditContent(activeChunk.content || \"\");\n setEditMetadata(activeChunk.metadata ? JSON.stringify(activeChunk.metadata, null, 2) : \"\");\n }\n }, [activeChunkIndex, activeChunk, isEditing]);\n\n const handleDelete = async () => {\n if (!activeChunk || isDeleting) return;\n setIsDeleting(true);\n try {\n // If chunked document, delete all chunks\n if (isChunkedDocument) {\n for (const chunk of chunks) {\n await del(`/${PLUGIN_ID}/embeddings/delete-embedding/${chunk.documentId}`);\n }\n } else {\n await del(`/${PLUGIN_ID}/embeddings/delete-embedding/${activeChunk.documentId}`);\n }\n navigate(`/plugins/${PLUGIN_ID}`);\n } catch (error) {\n console.error(\"Failed to delete embedding:\", error);\n setIsDeleting(false);\n }\n };\n\n const handleStartEdit = () => {\n if (activeChunk) {\n setEditTitle(activeChunk.title || \"\");\n setEditContent(activeChunk.content || \"\");\n setEditMetadata(activeChunk.metadata ? JSON.stringify(activeChunk.metadata, null, 2) : \"\");\n }\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setIsEditing(false);\n // Reset to current chunk values\n if (activeChunk) {\n setEditTitle(activeChunk.title || \"\");\n setEditContent(activeChunk.content || \"\");\n setEditMetadata(activeChunk.metadata ? JSON.stringify(activeChunk.metadata, null, 2) : \"\");\n }\n };\n\n const handleSave = async () => {\n if (!activeChunk || isSaving) return;\n\n // Validate metadata JSON if provided\n let parsedMetadata = null;\n if (editMetadata.trim()) {\n try {\n parsedMetadata = JSON.parse(editMetadata);\n } catch {\n toggleNotification({\n type: \"warning\",\n message: \"Invalid JSON in metadata field\",\n });\n return;\n }\n }\n\n setIsSaving(true);\n try {\n const response = await put(`/${PLUGIN_ID}/embeddings/update-embedding/${activeChunk.documentId}`, {\n data: {\n title: editTitle.trim(),\n content: editContent.trim(),\n metadata: parsedMetadata,\n },\n });\n\n const updatedData = response.data as EmbeddingData;\n\n // Update the chunk in the chunks array\n if (isChunkedDocument) {\n const newChunks = [...chunks];\n newChunks[activeChunkIndex] = updatedData;\n setChunks(newChunks);\n } else {\n setData(updatedData);\n setChunks([updatedData]);\n }\n\n setIsEditing(false);\n toggleNotification({\n type: \"success\",\n message: \"Chunk updated successfully\",\n });\n } catch (error: any) {\n console.error(\"Failed to update embedding:\", error);\n toggleNotification({\n type: \"danger\",\n message: error.message || \"Failed to update embedding\",\n });\n } finally {\n setIsSaving(false);\n }\n };\n\n const handleChunkSelect = (index: number) => {\n if (isEditing) {\n // Warn user about unsaved changes\n const confirmed = globalThis.confirm(\"You have unsaved changes. Discard them?\");\n if (!confirmed) return;\n setIsEditing(false);\n }\n setActiveChunkIndex(index);\n };\n\n const getOriginalTitle = () => {\n if (isChunkedDocument && chunks[0]?.metadata) {\n return (chunks[0].metadata as any).originalTitle || chunks[0].title?.replace(/\\s*\\[Part \\d+\\/\\d+\\]$/, '');\n }\n return data?.title || \"Embedding Details\";\n };\n\n if (isLoading) {\n return (\n <Main>\n <Layouts.Header\n title=\"Loading...\"\n navigationAction={<BackLink to={`/plugins/${PLUGIN_ID}`} />}\n />\n <Layouts.Content>\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>Loading embedding details...</Loader>\n </Flex>\n </Layouts.Content>\n </Main>\n );\n }\n\n if (!data || !activeChunk) {\n return (\n <Main>\n <Layouts.Header\n title=\"Embedding Not Found\"\n navigationAction={<BackLink to={`/plugins/${PLUGIN_ID}`} />}\n />\n <Layouts.Content>\n <Box padding={8} textAlign=\"center\">\n <Typography>The requested embedding could not be found.</Typography>\n </Box>\n </Layouts.Content>\n </Main>\n );\n }\n\n const headerTitle = isEditing\n ? `Edit: ${activeChunk.title}`\n : isChunkedDocument\n ? getOriginalTitle()\n : (data.title || \"Embedding Details\");\n\n const headerSubtitle = isChunkedDocument\n ? `Chunked Document (${chunks.length} parts)`\n : `Embedding ID: ${data.embeddingId || \"N/A\"}`;\n\n return (\n <Main>\n <Layouts.Header\n title={headerTitle}\n subtitle={headerSubtitle}\n primaryAction={\n isEditing ? (\n <Flex gap={2}>\n <Button variant=\"tertiary\" startIcon={<Cross />} onClick={handleCancelEdit}>\n Cancel\n </Button>\n <Button startIcon={<Check />} onClick={handleSave} loading={isSaving}>\n {isSaving ? \"Saving...\" : \"Save Chunk\"}\n </Button>\n </Flex>\n ) : (\n <Flex gap={2}>\n <Button variant=\"secondary\" startIcon={<Pencil />} onClick={handleStartEdit}>\n Edit {isChunkedDocument ? \"Chunk\" : \"\"}\n </Button>\n <ConfirmDeleteEmbedding onConfirm={handleDelete} isLoading={isDeleting} />\n </Flex>\n )\n }\n navigationAction={<BackLink to={`/plugins/${PLUGIN_ID}`} />}\n />\n <Layouts.Content>\n <Box padding={8}>\n {/* Chunk tabs for chunked documents */}\n {isChunkedDocument && (\n <Box marginBottom={4}>\n <Box background=\"neutral0\" padding={4} hasRadius>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3}>\n <Typography variant=\"beta\">Document Chunks</Typography>\n <Badge>{chunks.length} parts</Badge>\n </Flex>\n <ChunkTabsContainer gap={0}>\n {chunks.map((chunk, index) => (\n <ChunkTab\n key={chunk.documentId}\n $isActive={index === activeChunkIndex}\n onClick={() => handleChunkSelect(index)}\n >\n Part {index + 1}\n {index === activeChunkIndex && isEditing && \" (editing)\"}\n </ChunkTab>\n ))}\n </ChunkTabsContainer>\n </Box>\n </Box>\n )}\n\n {isEditing ? (\n <Grid.Root gap={6}>\n <Grid.Item col={8} s={12}>\n <Box background=\"neutral100\" padding={1} hasRadius>\n <Box padding={4} background=\"neutral0\" hasRadius>\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Title</Field.Label>\n <TextInput\n value={editTitle}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditTitle(e.target.value)\n }\n />\n </Field.Root>\n </Box>\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Content</Field.Label>\n <Field.Hint>\n Changes to content will regenerate the embedding vector\n </Field.Hint>\n </Field.Root>\n <MarkdownEditor\n content={editContent}\n onChange={setEditContent}\n height={300}\n />\n </Box>\n </Box>\n </Box>\n </Grid.Item>\n <Grid.Item col={4} s={12}>\n <Box background=\"neutral100\" padding={1} hasRadius>\n <Box padding={4} background=\"neutral0\" hasRadius>\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Metadata (JSON)</Field.Label>\n <Field.Hint>Optional custom metadata</Field.Hint>\n <Textarea\n value={editMetadata}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n setEditMetadata(e.target.value)\n }\n placeholder='{\"key\": \"value\"}'\n />\n </Field.Root>\n </Box>\n </Box>\n </Box>\n </Grid.Item>\n </Grid.Root>\n ) : (\n <Grid.Root gap={6}>\n <Grid.Item col={8} s={12}>\n <Box background=\"neutral100\" padding={1} hasRadius>\n <Box padding={4} background=\"neutral0\" hasRadius>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3}>\n <StyledTypography variant=\"beta\" style={{ margin: 0 }}>\n {isChunkedDocument ? `Part ${activeChunkIndex + 1} Content` : \"Embedding Content\"}\n </StyledTypography>\n {isChunkedDocument && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {activeChunk.content?.length || 0} characters\n </Typography>\n )}\n </Flex>\n {activeChunk.content ? (\n <Markdown>{activeChunk.content}</Markdown>\n ) : (\n <Typography textColor=\"neutral600\">No content</Typography>\n )}\n </Box>\n </Box>\n </Grid.Item>\n <Grid.Item col={4} s={12}>\n <Box background=\"neutral100\" padding={1} hasRadius>\n <Metadata data={activeChunk} />\n </Box>\n </Grid.Item>\n </Grid.Root>\n )}\n </Box>\n </Layouts.Content>\n </Main>\n );\n}\n","import { Page } from '@strapi/strapi/admin';\nimport { Routes, Route } from 'react-router-dom';\n\nimport { HomePage } from './HomePage';\nimport CreateEmbeddings from './CreateEmbeddings';\nimport EmbeddingDetails from './EmbeddingDetails';\n\nconst App = () => {\n return (\n <Routes>\n <Route index element={<HomePage />} />\n <Route path=\"*\" element={<Page.Error />} />\n <Route path=\"/embeddings\" element={<CreateEmbeddings />} />\n <Route path=\"/embeddings/:id\" element={<EmbeddingDetails />} />\n </Routes>\n );\n};\n\nexport { App };\n"],"names":["jsxs","jsx","EmptyStateLayout","Link","PLUGIN_ID","Button","Plus","styled","Tr","useNavigate","Box","Table","Thead","Th","Typography","VisuallyHidden","Tbody","Td","Flex","IconButton","ArrowRight","ReactMarkdown","Accordion","Fragment","index","useFetchClient","useRef","useState","useEffect","qs","RobotIcon","Modal","TextInput","Card","Database","Badge","Divider","Check","Cross","Alert","ArrowClockwise","Loader","SingleSelect","SingleSelectOption","Checkbox","WarningCircle","useCallback","useMemo","Main","Layouts","Pagination","PreviousLink","PageLink","NextLink","Search","Field","MarkdownEditor","Textarea","NavLink","ArrowLeft","useIntl","Dialog","Trash","useParams","useNotification","Pencil","Grid","Routes","Route","Page"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App-MjsTrWRS.mjs","sources":["../../admin/src/components/custom/Illo.tsx","../../admin/src/components/custom/EmptyState.tsx","../../admin/src/components/custom/EmbeddingsTable.tsx","../../admin/src/components/custom/Markdown.tsx","../../admin/src/components/custom/ChatModal.tsx","../../admin/src/utils/api.ts","../../admin/src/components/custom/SyncModal.tsx","../../admin/src/pages/HomePage.tsx","../../admin/src/components/forms/CreateEmbeddingForm.tsx","../../admin/src/components/custom/BackLink.tsx","../../admin/src/pages/CreateEmbeddings.tsx","../../admin/src/pages/EmbeddingDetails.tsx","../../admin/src/pages/App.tsx"],"sourcesContent":["export const Illo = () => (\n <svg width=\"159\" height=\"88\" viewBox=\"0 0 159 88\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M134.933 17.417C137.768 17.417 140.067 19.7153 140.067 22.5503C140.067 25.3854 137.768 27.6837 134.933 27.6837H105.6C108.435 27.6837 110.733 29.9819 110.733 32.817C110.733 35.6521 108.435 37.9503 105.6 37.9503H121.733C124.568 37.9503 126.867 40.2486 126.867 43.0837C126.867 45.9187 124.568 48.217 121.733 48.217H114.272C110.698 48.217 107.8 50.5153 107.8 53.3503C107.8 55.2404 109.267 56.9515 112.2 58.4837C115.035 58.4837 117.333 60.7819 117.333 63.617C117.333 66.4521 115.035 68.7503 112.2 68.7503H51.3333C48.4982 68.7503 46.2 66.4521 46.2 63.617C46.2 60.7819 48.4982 58.4837 51.3333 58.4837H22.7333C19.8982 58.4837 17.6 56.1854 17.6 53.3503C17.6 50.5153 19.8982 48.217 22.7333 48.217H52.0666C54.9017 48.217 57.2 45.9187 57.2 43.0837C57.2 40.2486 54.9017 37.9503 52.0666 37.9503H33.7333C30.8982 37.9503 28.6 35.6521 28.6 32.817C28.6 29.9819 30.8982 27.6837 33.7333 27.6837H63.0666C60.2316 27.6837 57.9333 25.3854 57.9333 22.5503C57.9333 19.7153 60.2316 17.417 63.0666 17.417H134.933ZM134.933 37.9503C137.768 37.9503 140.067 40.2486 140.067 43.0837C140.067 45.9187 137.768 48.217 134.933 48.217C132.098 48.217 129.8 45.9187 129.8 43.0837C129.8 40.2486 132.098 37.9503 134.933 37.9503Z\"\n fill=\"#DBDBFA\"\n />\n\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M95.826 16.6834L102.647 66.4348L103.26 71.4261C103.458 73.034 102.314 74.4976 100.706 74.695L57.7621 79.9679C56.1542 80.1653 54.6906 79.0219 54.4932 77.4139L47.8816 23.5671C47.7829 22.7631 48.3546 22.0313 49.1586 21.9326C49.1637 21.932 49.1688 21.9313 49.1739 21.9307L52.7367 21.5311L95.826 16.6834ZM55.6176 21.208L58.9814 20.8306Z\"\n fill=\"white\"\n />\n\n <path\n d=\"M55.6176 21.208L58.9814 20.8306M95.826 16.6834L102.647 66.4348L103.26 71.4261C103.458 73.034 102.314 74.4976 100.706 74.695L57.7621 79.9679C56.1542 80.1653 54.6906 79.0219 54.4932 77.4139L47.8816 23.5671C47.7829 22.7631 48.3546 22.0313 49.1586 21.9326C49.1637 21.932 49.1688 21.9313 49.1739 21.9307L52.7367 21.5311L95.826 16.6834Z\"\n stroke=\"#7E7BF6\"\n strokeWidth=\"2.5\"\n />\n\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M93.9695 19.8144L100.144 64.9025L100.699 69.4258C100.878 70.8831 99.8559 72.2077 98.416 72.3845L59.9585 77.1065C58.5185 77.2833 57.2062 76.2453 57.0272 74.7881L51.0506 26.112C50.9519 25.308 51.5236 24.5762 52.3276 24.4775L57.0851 23.8934\"\n fill=\"#F0F0FF\"\n />\n\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M97.701 7.33301H64.2927C63.7358 7.33301 63.2316 7.55873 62.8667 7.92368C62.5017 8.28862 62.276 8.79279 62.276 9.34967V65.083C62.276 65.6399 62.5017 66.1441 62.8667 66.509C63.2316 66.874 63.7358 67.0997 64.2927 67.0997H107.559C108.116 67.0997 108.62 66.874 108.985 66.509C109.35 66.1441 109.576 65.6399 109.576 65.083V19.202C109.576 18.6669 109.363 18.1537 108.985 17.7755L99.1265 7.92324C98.7484 7.54531 98.2356 7.33301 97.701 7.33301Z\"\n fill=\"white\"\n stroke=\"#7F7CFA\"\n strokeWidth=\"2.5\"\n />\n\n <path\n d=\"M98.026 8.17871V16.6833C98.026 17.8983 99.011 18.8833 100.226 18.8833H106.044\"\n stroke=\"#807EFA\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n\n <path\n d=\"M70.1594 56.2838H89.2261M70.1594 18.8838H89.2261H70.1594ZM70.1594 27.6838H101.693H70.1594ZM70.1594 37.2171H101.693H70.1594ZM70.1594 46.7505H101.693H70.1594Z\"\n stroke=\"#817FFA\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n","import { EmptyStateLayout, Button } from '@strapi/design-system';\nimport { Link } from 'react-router-dom';\nimport { PLUGIN_ID } from \"../../pluginId\"\nimport { Plus } from '@strapi/icons';\nimport { Illo } from './Illo';\n\nexport function EmptyState() {\n return (\n <EmptyStateLayout\n icon={<Illo />}\n content=\"Let's create our first embedding...\"\n action={\n <Link to={`/plugins/${PLUGIN_ID}/embeddings`}>\n <Button startIcon={<Plus />}>Create new embedding</Button>\n </Link>\n }\n />\n );\n}","import React from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport {\n Box,\n Table,\n Thead,\n Tbody,\n Tr,\n Td,\n Th,\n Typography,\n VisuallyHidden,\n Flex,\n IconButton,\n} from \"@strapi/design-system\";\nimport { ArrowRight } from \"@strapi/icons\";\nimport { PLUGIN_ID } from \"../../pluginId\";\n\nconst StyledTr = styled(Tr)`\n cursor: pointer;\n &:hover {\n background-color: #f0f0ff;\n }\n`;\n\ninterface Embedding {\n id: number;\n documentId: string;\n title: string;\n content?: string;\n embeddingId?: string;\n}\n\ninterface EmbeddingsTableProps {\n data: Embedding[];\n}\n\nexport function EmbeddingsTable({ data }: Readonly<EmbeddingsTableProps>) {\n const navigate = useNavigate();\n\n const handleRowClick = (documentId: string) => {\n navigate(`/plugins/${PLUGIN_ID}/embeddings/${documentId}`);\n };\n\n return (\n <Box padding={0} background=\"neutral100\">\n <Table colCount={5} rowCount={data.length + 1}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">ID</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Title</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Content</Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">Embed ID</Typography>\n </Th>\n <Th>\n <VisuallyHidden>Actions</VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data?.map((entry) => (\n <StyledTr\n key={entry.documentId}\n onClick={() => handleRowClick(entry.documentId)}\n >\n <Td>\n <Typography textColor=\"neutral800\">\n {entry.documentId.slice(0, 8)}...\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {entry.title?.slice(0, 30)}\n {entry.title?.length > 30 ? \"...\" : \"\"}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {entry.content?.slice(0, 30)}\n {entry.content && entry.content.length > 30 ? \"...\" : \"\"}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {entry.embeddingId?.slice(0, 8)}\n {entry.embeddingId && entry.embeddingId.length > 8\n ? \"...\"\n : \"\"}\n </Typography>\n </Td>\n <Td>\n <Flex>\n <IconButton\n withTooltip={false}\n label=\"View details\"\n onClick={(e: React.MouseEvent) => {\n e.stopPropagation();\n handleRowClick(entry.documentId);\n }}\n >\n <ArrowRight />\n </IconButton>\n </Flex>\n </Td>\n </StyledTr>\n ))}\n </Tbody>\n </Table>\n </Box>\n );\n}\n","import React from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport styled from \"styled-components\";\n\nconst MarkdownWrapper = styled.div`\n /* Headers */\n h1 {\n font-size: 2.25rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h2 {\n font-size: 1.75rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h3 {\n font-size: 1.5rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h4 {\n font-size: 1.25rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h5 {\n font-size: 1.125rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #272728;\n }\n\n h6 {\n font-size: 1rem;\n font-weight: 700;\n margin-bottom: 1rem;\n color: #9d4edd;\n }\n\n /* Horizontal rules */\n hr {\n border-color: #d1d5db;\n margin-top: 2rem;\n margin-bottom: 2rem;\n }\n\n a {\n color: #4945ff;\n text-decoration: underline;\n }\n\n /* Paragraphs */\n p {\n margin-bottom: 1rem;\n line-height: 1.5rem;\n color: #39393a;\n }\n\n /* Emphasis */\n strong {\n font-weight: 700;\n }\n\n em {\n font-style: italic;\n }\n\n del {\n text-decoration: line-through;\n }\n\n /* Blockquotes */\n blockquote {\n border-left-width: 1px;\n border-color: #9ca3af;\n padding-left: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 1rem;\n }\n\n /* Lists */\n ul {\n list-style-type: disc;\n padding-left: 1rem;\n margin-bottom: 1rem;\n }\n\n ol {\n list-style-type: decimal;\n padding-left: 1rem;\n margin-bottom: 1rem;\n }\n\n li {\n margin-bottom: 0.5rem;\n }\n\n li > ul {\n list-style-type: disc;\n padding-left: 1rem;\n margin-bottom: 0.5rem;\n }\n\n li > ol {\n list-style-type: decimal;\n padding-left: 1rem;\n margin-bottom: 0.5rem;\n }\n\n /* Code blocks */\n pre {\n font-family: monospace;\n background-color: #1f2937;\n color: #f9fafb;\n border-radius: 0.375rem;\n padding: 1rem;\n margin-top: 1.5rem;\n margin-bottom: 1.5rem;\n line-height: 1.5rem;\n overflow: auto;\n }\n\n code {\n font-family: monospace;\n background-color: #1f2937;\n color: #f9fafb;\n border-radius: 0.375rem;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n }\n\n /* Tables */\n table {\n width: 100%;\n border-collapse: collapse;\n border-color: #d1d5db;\n margin-top: 1.5rem;\n margin-bottom: 1.5rem;\n }\n\n th {\n background-color: #1f2937;\n text-align: left;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n padding-right: 1rem;\n font-weight: 600;\n border-bottom-width: 1px;\n border-color: #d1d5db;\n }\n\n td {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n padding-right: 1rem;\n border-bottom-width: 1px;\n border-color: #d1d5db;\n }\n\n /* Images */\n img {\n width: 100%;\n object-fit: cover;\n border-radius: 0.75rem;\n margin-top: 1.5rem;\n margin-bottom: 1.5rem;\n }\n`;\n\ninterface MarkdownProps {\n children: string;\n}\n\nexport function Markdown({ children }: MarkdownProps) {\n return (\n <MarkdownWrapper>\n <ReactMarkdown>{children}</ReactMarkdown>\n </MarkdownWrapper>\n );\n}\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport qs from \"qs\";\nimport { useFetchClient } from \"@strapi/strapi/admin\";\nimport {\n Button,\n Typography,\n Box,\n TextInput,\n Modal,\n Accordion,\n Link,\n} from \"@strapi/design-system\";\n\nimport { PLUGIN_ID } from \"../../pluginId\";\nimport { RobotIcon } from \"./RobotIcon\";\nimport { Markdown } from \"./Markdown\";\n\nconst StyledButton = styled(Button)`\n position: fixed;\n bottom: 1.5rem;\n right: 1.5rem;\n height: 3.5rem;\n width: 3.5rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),\n 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n z-index: 100;\n\n svg {\n height: 1.75rem;\n width: 1.75rem;\n }\n`;\n\nconst ResponseContainer = styled.div`\n border: solid 1px #e3e9f3;\n border-radius: 4px;\n padding: 1rem;\n color: #32324d;\n font-weight: 400;\n font-size: 0.875rem;\n display: block;\n width: 100%;\n max-height: 400px;\n background: inherit;\n overflow-y: auto;\n scroll-behavior: smooth;\n`;\n\ninterface SourceDocument {\n pageContent: string;\n metadata: {\n id: string;\n title: string;\n collectionType?: string;\n fieldName?: string;\n };\n}\n\ninterface QueryResponse {\n text: string;\n sourceDocuments: SourceDocument[];\n}\n\ninterface AccordionDetailsProps {\n title: string;\n content: React.ReactNode;\n children?: React.ReactNode;\n}\n\nfunction AccordionDetails({ title, content, children }: AccordionDetailsProps) {\n return (\n <Box padding={1} background=\"primary100\">\n <Accordion.Root size=\"S\">\n <Accordion.Item value=\"acc-1\">\n <Accordion.Header>\n <Accordion.Trigger>{title}</Accordion.Trigger>\n </Accordion.Header>\n <Accordion.Content>\n <Box padding={3}>\n <Typography>{content}</Typography>\n {children && <Box padding={1}>{children}</Box>}\n </Box>\n </Accordion.Content>\n </Accordion.Item>\n </Accordion.Root>\n </Box>\n );\n}\n\ninterface ShowResponseProps {\n data: QueryResponse[];\n onNavigate: (id: string) => void;\n}\n\nfunction ShowResponse({ data, onNavigate }: ShowResponseProps) {\n return (\n <>\n {data.map((item, index) => (\n <Box key={index} marginBottom={4}>\n <Box padding={1}>\n <Markdown>{item.text}</Markdown>\n </Box>\n\n {item.sourceDocuments?.length > 0 &&\n item.sourceDocuments.map((doc, docIndex) => (\n <AccordionDetails\n key={docIndex}\n title=\"Original Source Document\"\n content={<Markdown>{doc.pageContent}</Markdown>}\n >\n <Link\n onClick={() => onNavigate(doc.metadata.id)}\n style={{ cursor: \"pointer\" }}\n >\n View Source for {doc.metadata.title}\n </Link>\n </AccordionDetails>\n ))}\n </Box>\n ))}\n </>\n );\n}\n\nexport function ChatModal() {\n const { get } = useFetchClient();\n const containerRef = useRef<HTMLDivElement>(null);\n const navigate = useNavigate();\n\n const [isVisible, setIsVisible] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [data, setData] = useState<QueryResponse[]>([]);\n\n useEffect(() => {\n if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight;\n }\n }, [data]);\n\n function handleNavigate(id: string) {\n setIsVisible(false);\n navigate(`/plugins/${PLUGIN_ID}/embeddings/${id}`);\n }\n\n async function handleQueryEmbeddings(e: React.FormEvent) {\n e.preventDefault();\n if (!inputValue.trim() || isLoading) return;\n\n setIsLoading(true);\n try {\n const response = await get(\n `/${PLUGIN_ID}/embeddings/embeddings-query?${qs.stringify({\n query: inputValue,\n })}`\n );\n if (response.data && !response.data.error) {\n setData((prev) => [...prev, response.data as QueryResponse]);\n }\n setInputValue(\"\");\n } catch (error) {\n console.error(\"Query failed:\", error);\n } finally {\n setIsLoading(false);\n }\n }\n\n return (\n <>\n <StyledButton onClick={() => setIsVisible(true)} aria-label=\"Open chat\">\n <RobotIcon height={28} width={28} />\n </StyledButton>\n\n <Modal.Root open={isVisible} onOpenChange={setIsVisible}>\n <Modal.Content>\n <Modal.Header>\n <Modal.Title>Chat With Your Data</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {data.length > 0 && (\n <Box padding={1} marginBottom={4}>\n <ResponseContainer ref={containerRef}>\n <ShowResponse data={data} onNavigate={handleNavigate} />\n </ResponseContainer>\n </Box>\n )}\n <Box padding={1}>\n <form onSubmit={handleQueryEmbeddings}>\n <TextInput\n placeholder=\"Enter your question\"\n type=\"text\"\n aria-label=\"Question\"\n name=\"question\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setInputValue(e.target.value)\n }\n value={inputValue}\n />\n </form>\n </Box>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\">Cancel</Button>\n </Modal.Close>\n <Button\n onClick={handleQueryEmbeddings}\n disabled={!inputValue.trim() || isLoading}\n loading={isLoading}\n >\n {isLoading ? \"Sending...\" : \"Send\"}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n </>\n );\n}\n","import { PLUGIN_ID } from \"../pluginId\";\nimport qs from \"qs\";\n\nconst API_BASE = `/${PLUGIN_ID}/embeddings`;\nconst SYNC_BASE = `/${PLUGIN_ID}`;\n\ninterface CreateEmbeddingData {\n title: string;\n content: string;\n collectionType?: string;\n fieldName?: string;\n related?: {\n __type: string;\n id: number;\n };\n}\n\ninterface EmbeddingsListParams {\n page?: number;\n pageSize?: number;\n filters?: Record<string, any>;\n}\n\nexport const embeddingsApi = {\n create: async (\n fetchClient: { post: Function },\n data: CreateEmbeddingData\n ) => {\n const response = await fetchClient.post(`${API_BASE}/create-embedding`, {\n data,\n });\n return response.data;\n },\n\n delete: async (fetchClient: { del: Function }, id: string) => {\n const response = await fetchClient.del(`${API_BASE}/delete-embedding/${id}`);\n return response.data;\n },\n\n getOne: async (fetchClient: { get: Function }, id: string) => {\n const response = await fetchClient.get(`${API_BASE}/find/${id}`);\n return response.data;\n },\n\n getAll: async (\n fetchClient: { get: Function },\n params?: EmbeddingsListParams\n ) => {\n const queryString = params ? `?${qs.stringify(params)}` : \"\";\n const response = await fetchClient.get(`${API_BASE}/find${queryString}`);\n return response.data;\n },\n\n query: async (fetchClient: { get: Function }, query: string) => {\n const response = await fetchClient.get(\n `${API_BASE}/embeddings-query?${qs.stringify({ query })}`\n );\n return response.data;\n },\n};\n\nexport interface SyncStatus {\n neonCount: number;\n strapiCount: number;\n inSync: boolean;\n missingInStrapi: number;\n missingInNeon: number;\n contentDifferences: number;\n}\n\nexport interface SyncResult {\n success: boolean;\n timestamp: string;\n dryRun?: boolean;\n neonCount: number;\n strapiCount: number;\n actions: {\n created: number;\n updated: number;\n orphansRemoved: number;\n };\n details: {\n created: string[];\n updated: string[];\n orphansRemoved: string[];\n };\n errors: string[];\n}\n\nexport interface RecreateResult {\n success: boolean;\n message: string;\n totalProcessed: number;\n created: number;\n failed: number;\n errors: string[];\n}\n\nexport const syncApi = {\n getStatus: async (fetchClient: { get: Function }): Promise<SyncStatus> => {\n const response = await fetchClient.get(`${SYNC_BASE}/sync/status`);\n return response.data;\n },\n\n syncFromNeon: async (\n fetchClient: { post: Function },\n options?: { removeOrphans?: boolean; dryRun?: boolean }\n ): Promise<SyncResult> => {\n const queryString = options ? `?${qs.stringify(options)}` : \"\";\n const response = await fetchClient.post(`${SYNC_BASE}/sync${queryString}`);\n return response.data;\n },\n\n recreateAll: async (fetchClient: { post: Function }): Promise<RecreateResult> => {\n const response = await fetchClient.post(`${SYNC_BASE}/recreate`);\n return response.data;\n },\n};\n","import React, { useState, useEffect } from 'react';\nimport {\n Modal,\n Button,\n Flex,\n Typography,\n Box,\n Loader,\n Badge,\n Divider,\n SingleSelect,\n SingleSelectOption,\n Checkbox,\n Alert,\n Card,\n Grid,\n} from '@strapi/design-system';\nimport { ArrowClockwise, Check, Cross, WarningCircle, Database } from '@strapi/icons';\nimport { useFetchClient } from '@strapi/strapi/admin';\nimport { syncApi, SyncStatus, SyncResult, RecreateResult } from '../../utils/api';\n\ntype SyncOperation = 'status' | 'sync' | 'recreate';\n\ninterface SyncModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSyncComplete?: () => void;\n}\n\ninterface StatCardProps {\n label: string;\n value: number | string;\n subtitle?: string;\n variant?: 'default' | 'success' | 'warning' | 'danger';\n}\n\nfunction StatCard({ label, value, subtitle, variant = 'default' }: StatCardProps) {\n const bgColors = {\n default: 'neutral100',\n success: 'success100',\n warning: 'warning100',\n danger: 'danger100',\n };\n\n const textColors = {\n default: 'neutral800',\n success: 'success700',\n warning: 'warning700',\n danger: 'danger700',\n };\n\n return (\n <Box\n padding={4}\n background={bgColors[variant]}\n hasRadius\n borderColor=\"neutral200\"\n style={{ textAlign: 'center', minWidth: '120px' }}\n >\n <Typography variant=\"pi\" textColor=\"neutral600\" style={{ textTransform: 'uppercase', fontSize: '11px' }}>\n {label}\n </Typography>\n <Box paddingTop={1}>\n <Typography variant=\"alpha\" textColor={textColors[variant]} fontWeight=\"bold\">\n {value}\n </Typography>\n </Box>\n {subtitle && (\n <Box paddingTop={1}>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {subtitle}\n </Typography>\n </Box>\n )}\n </Box>\n );\n}\n\nexport function SyncModal({ isOpen, onClose, onSyncComplete }: SyncModalProps) {\n const fetchClient = useFetchClient();\n\n const [operation, setOperation] = useState<SyncOperation>('status');\n const [removeOrphans, setRemoveOrphans] = useState(false);\n const [dryRun, setDryRun] = useState(true);\n const [isLoading, setIsLoading] = useState(false);\n const [status, setStatus] = useState<SyncStatus | null>(null);\n const [syncResult, setSyncResult] = useState<SyncResult | null>(null);\n const [recreateResult, setRecreateResult] = useState<RecreateResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (isOpen) {\n fetchStatus();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n setSyncResult(null);\n setRecreateResult(null);\n setError(null);\n setOperation('status');\n setDryRun(true);\n setRemoveOrphans(false);\n }\n }, [isOpen]);\n\n const fetchStatus = async () => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await syncApi.getStatus(fetchClient);\n setStatus(result);\n } catch (err: any) {\n setError(err.message || 'Failed to fetch sync status');\n } finally {\n setIsLoading(false);\n }\n };\n\n const handleExecute = async () => {\n setIsLoading(true);\n setError(null);\n setSyncResult(null);\n setRecreateResult(null);\n\n try {\n if (operation === 'status') {\n await fetchStatus();\n } else if (operation === 'sync') {\n const result = await syncApi.syncFromNeon(fetchClient, { removeOrphans, dryRun });\n setSyncResult(result);\n if (!dryRun && onSyncComplete) {\n onSyncComplete();\n }\n } else if (operation === 'recreate') {\n const result = await syncApi.recreateAll(fetchClient);\n setRecreateResult(result);\n if (onSyncComplete) {\n onSyncComplete();\n }\n }\n } catch (err: any) {\n setError(err.message || 'Operation failed');\n } finally {\n setIsLoading(false);\n }\n };\n\n const renderStatus = () => {\n if (!status) return null;\n\n return (\n <Card padding={5} background=\"neutral0\" shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Flex gap={2} alignItems=\"center\">\n <Database />\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Sync Status\n </Typography>\n </Flex>\n <Badge active={status.inSync} size=\"S\">\n {status.inSync ? 'In Sync' : 'Out of Sync'}\n </Badge>\n </Flex>\n\n <Divider />\n\n <Flex gap={4} justifyContent=\"center\" wrap=\"wrap\">\n <StatCard\n label=\"Neon DB\"\n value={status.neonCount}\n subtitle=\"embeddings\"\n />\n <StatCard\n label=\"Strapi DB\"\n value={status.strapiCount}\n subtitle=\"embeddings\"\n />\n </Flex>\n\n {!status.inSync && (\n <>\n <Divider />\n <Box padding={3} background=\"warning100\" hasRadius>\n <Flex direction=\"column\" gap={2}>\n <Typography variant=\"sigma\" textColor=\"warning700\">\n Differences Found\n </Typography>\n {status.missingInStrapi > 0 && (\n <Typography variant=\"pi\" textColor=\"warning700\">\n • {status.missingInStrapi} embeddings missing in Strapi (will be created)\n </Typography>\n )}\n {status.missingInNeon > 0 && (\n <Typography variant=\"pi\" textColor=\"danger600\">\n • {status.missingInNeon} orphaned entries in Strapi (not in Neon)\n </Typography>\n )}\n {status.contentDifferences > 0 && (\n <Typography variant=\"pi\" textColor=\"warning700\">\n • {status.contentDifferences} entries with content differences\n </Typography>\n )}\n </Flex>\n </Box>\n </>\n )}\n </Flex>\n </Card>\n );\n };\n\n const renderSyncResult = () => {\n if (!syncResult) return null;\n\n return (\n <Card padding={5} background={syncResult.success ? 'success100' : 'danger100'} shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"delta\" fontWeight=\"bold\">\n {syncResult.dryRun ? 'Preview Results' : 'Sync Results'}\n </Typography>\n <Badge active={syncResult.success}>\n {syncResult.success ? (\n <Flex gap={1} alignItems=\"center\">\n <Check width={12} height={12} />\n Success\n </Flex>\n ) : (\n <Flex gap={1} alignItems=\"center\">\n <Cross width={12} height={12} />\n Failed\n </Flex>\n )}\n </Badge>\n </Flex>\n\n <Divider />\n\n <Flex gap={3} justifyContent=\"center\" wrap=\"wrap\">\n <StatCard\n label=\"Created\"\n value={syncResult.actions.created}\n variant={syncResult.actions.created > 0 ? 'success' : 'default'}\n />\n <StatCard\n label=\"Updated\"\n value={syncResult.actions.updated}\n variant={syncResult.actions.updated > 0 ? 'warning' : 'default'}\n />\n <StatCard\n label=\"Removed\"\n value={syncResult.actions.orphansRemoved}\n variant={syncResult.actions.orphansRemoved > 0 ? 'danger' : 'default'}\n />\n </Flex>\n\n {syncResult.errors.length > 0 && (\n <Box padding={3} background=\"danger100\" hasRadius>\n <Typography variant=\"sigma\" textColor=\"danger700\">\n Errors\n </Typography>\n <Box paddingTop={2}>\n {syncResult.errors.slice(0, 3).map((err, i) => (\n <Typography key={i} variant=\"pi\" textColor=\"danger600\">\n • {err}\n </Typography>\n ))}\n {syncResult.errors.length > 3 && (\n <Typography variant=\"pi\" textColor=\"danger600\" fontWeight=\"bold\">\n + {syncResult.errors.length - 3} more errors\n </Typography>\n )}\n </Box>\n </Box>\n )}\n\n {syncResult.dryRun && (\n <Box paddingTop={2}>\n <Alert variant=\"default\" closeLabel=\"Close\">\n This was a preview. No changes were made. Click \"Apply Changes\" below to execute the sync.\n </Alert>\n </Box>\n )}\n </Flex>\n </Card>\n );\n };\n\n const renderRecreateResult = () => {\n if (!recreateResult) return null;\n\n return (\n <Card padding={5} background={recreateResult.success ? 'success100' : 'danger100'} shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Flex justifyContent=\"space-between\" alignItems=\"center\">\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Recreate Results\n </Typography>\n <Badge active={recreateResult.success}>\n {recreateResult.success ? 'Success' : 'Failed'}\n </Badge>\n </Flex>\n\n <Divider />\n\n <Flex gap={3} justifyContent=\"center\" wrap=\"wrap\">\n <StatCard\n label=\"Processed\"\n value={recreateResult.totalProcessed}\n />\n <StatCard\n label=\"Created\"\n value={recreateResult.created}\n variant=\"success\"\n />\n <StatCard\n label=\"Failed\"\n value={recreateResult.failed}\n variant={recreateResult.failed > 0 ? 'danger' : 'default'}\n />\n </Flex>\n\n {recreateResult.errors.length > 0 && (\n <Box padding={3} background=\"danger100\" hasRadius>\n <Typography variant=\"sigma\" textColor=\"danger700\">\n Errors\n </Typography>\n <Box paddingTop={2}>\n {recreateResult.errors.slice(0, 3).map((err, i) => (\n <Typography key={i} variant=\"pi\" textColor=\"danger600\">\n • {err}\n </Typography>\n ))}\n </Box>\n </Box>\n )}\n </Flex>\n </Card>\n );\n };\n\n const getButtonLabel = () => {\n if (operation === 'status') return 'Refresh Status';\n if (operation === 'sync') return dryRun ? 'Preview Sync' : 'Run Sync';\n if (operation === 'recreate') return 'Recreate All';\n return 'Execute';\n };\n\n const handleApplyChanges = async () => {\n setIsLoading(true);\n setError(null);\n setSyncResult(null);\n\n try {\n const result = await syncApi.syncFromNeon(fetchClient, { removeOrphans, dryRun: false });\n setSyncResult(result);\n if (onSyncComplete) {\n onSyncComplete();\n }\n } catch (err: any) {\n setError(err.message || 'Failed to apply changes');\n } finally {\n setIsLoading(false);\n }\n };\n\n const showApplyButton = syncResult?.dryRun && syncResult?.success;\n\n return (\n <Modal.Root open={isOpen} onOpenChange={(open: boolean) => !open && onClose()}>\n <Modal.Content>\n <Modal.Header>\n <Flex gap={2} alignItems=\"center\">\n <ArrowClockwise />\n <Modal.Title>Database Sync</Modal.Title>\n </Flex>\n </Modal.Header>\n\n <Modal.Body>\n <Flex direction=\"column\" gap={5}>\n {error && (\n <Alert variant=\"danger\" closeLabel=\"Close\" onClose={() => setError(null)}>\n {error}\n </Alert>\n )}\n\n {isLoading && !status ? (\n <Flex justifyContent=\"center\" padding={6}>\n <Loader>Loading status...</Loader>\n </Flex>\n ) : (\n renderStatus()\n )}\n\n <Card padding={5} background=\"neutral0\" shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Select Operation\n </Typography>\n\n <SingleSelect\n value={operation}\n onChange={(value: string) => setOperation(value as SyncOperation)}\n disabled={isLoading}\n size=\"M\"\n >\n <SingleSelectOption value=\"status\">\n Check Status\n </SingleSelectOption>\n <SingleSelectOption value=\"sync\">\n Sync from Neon\n </SingleSelectOption>\n <SingleSelectOption value=\"recreate\">\n Recreate All (Danger)\n </SingleSelectOption>\n </SingleSelect>\n\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {operation === 'status' && 'Compare Neon and Strapi databases without making changes.'}\n {operation === 'sync' && 'Import embeddings from Neon DB to Strapi. Use this to restore missing entries.'}\n {operation === 'recreate' && 'Delete all Neon embeddings and recreate them from Strapi data.'}\n </Typography>\n </Flex>\n </Card>\n\n {operation === 'sync' && (\n <Card padding={5} background=\"neutral0\" shadow=\"tableShadow\">\n <Flex direction=\"column\" gap={4}>\n <Typography variant=\"delta\" fontWeight=\"bold\">\n Sync Options\n </Typography>\n <Flex direction=\"column\" gap={3}>\n <Checkbox\n checked={dryRun}\n onCheckedChange={(checked: boolean) => setDryRun(checked)}\n >\n <Flex direction=\"column\">\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n Dry Run\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Preview changes without applying them\n </Typography>\n </Flex>\n </Checkbox>\n <Checkbox\n checked={removeOrphans}\n onCheckedChange={(checked: boolean) => setRemoveOrphans(checked)}\n >\n <Flex direction=\"column\">\n <Typography variant=\"omega\" fontWeight=\"semiBold\">\n Remove Orphans\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n Delete Strapi entries that don't exist in Neon\n </Typography>\n </Flex>\n </Checkbox>\n </Flex>\n </Flex>\n </Card>\n )}\n\n {operation === 'recreate' && (\n <Alert variant=\"danger\" closeLabel=\"Close\">\n <Flex direction=\"column\" gap={2}>\n <Flex gap={2} alignItems=\"center\">\n <WarningCircle />\n <Typography variant=\"omega\" fontWeight=\"bold\">\n Destructive Operation\n </Typography>\n </Flex>\n <Typography variant=\"pi\">\n This will delete ALL embeddings in Neon and recreate them from Strapi data.\n This operation cannot be undone. Only use if embeddings are corrupted.\n </Typography>\n </Flex>\n </Alert>\n )}\n\n {syncResult && renderSyncResult()}\n {recreateResult && renderRecreateResult()}\n </Flex>\n </Modal.Body>\n\n <Modal.Footer>\n <Flex justifyContent=\"space-between\" width=\"100%\">\n <Modal.Close>\n <Button variant=\"tertiary\">Cancel</Button>\n </Modal.Close>\n <Flex gap={2}>\n {showApplyButton && (\n <Button\n onClick={handleApplyChanges}\n loading={isLoading}\n startIcon={<Check />}\n variant=\"success\"\n >\n Apply Changes\n </Button>\n )}\n <Button\n onClick={handleExecute}\n loading={isLoading}\n startIcon={<ArrowClockwise />}\n variant={operation === 'recreate' ? 'danger' : 'secondary'}\n >\n {getButtonLabel()}\n </Button>\n </Flex>\n </Flex>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n}\n","import React, { useEffect, useState, useCallback, useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Main,\n Box,\n Button,\n TextInput,\n Flex,\n Loader,\n Typography,\n Pagination,\n PreviousLink,\n PageLink,\n NextLink,\n} from '@strapi/design-system';\nimport { Plus, Search, ArrowClockwise } from '@strapi/icons';\nimport { useFetchClient, Layouts } from '@strapi/strapi/admin';\nimport qs from 'qs';\n\nimport { PLUGIN_ID } from '../pluginId';\nimport { EmptyState } from '../components/custom/EmptyState';\nimport { EmbeddingsTable } from '../components/custom/EmbeddingsTable';\nimport { ChatModal } from '../components/custom/ChatModal';\nimport { SyncModal } from '../components/custom/SyncModal';\n\ninterface Embedding {\n id: number;\n documentId: string;\n title: string;\n content?: string;\n embeddingsId?: string;\n}\n\ninterface EmbeddingsResponse {\n data: Embedding[];\n count: number;\n totalCount: number;\n}\n\nconst PAGE_SIZE = 10;\n\nfunction debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\nexport function HomePage() {\n const { get } = useFetchClient();\n const navigate = useNavigate();\n\n const [embeddings, setEmbeddings] = useState<EmbeddingsResponse | null>(null);\n const [search, setSearch] = useState('');\n const [isLoading, setIsLoading] = useState(true);\n const [currentPage, setCurrentPage] = useState(1);\n const [isSyncModalOpen, setIsSyncModalOpen] = useState(false);\n\n const totalPages = embeddings ? Math.ceil(embeddings.totalCount / PAGE_SIZE) : 0;\n\n const buildQuery = (searchTerm: string, page: number) =>\n qs.stringify({\n page,\n pageSize: PAGE_SIZE,\n filters: searchTerm\n ? {\n $or: [{ title: { $containsi: searchTerm } }, { content: { $containsi: searchTerm } }],\n }\n : undefined,\n });\n\n const fetchData = useCallback(\n async (searchTerm: string, page: number) => {\n setIsLoading(true);\n try {\n const response = await get(`/${PLUGIN_ID}/embeddings/find?${buildQuery(searchTerm, page)}`);\n setEmbeddings(response.data as EmbeddingsResponse);\n } catch (error) {\n console.error('Failed to fetch embeddings:', error);\n setEmbeddings({ data: [], count: 0, totalCount: 0 });\n } finally {\n setIsLoading(false);\n }\n },\n [get]\n );\n\n const debouncedFetch = useMemo(() => debounce(fetchData, 500), [fetchData]);\n\n useEffect(() => {\n debouncedFetch(search, currentPage);\n }, [search, currentPage, debouncedFetch]);\n\n // Reset to page 1 when search changes\n useEffect(() => {\n setCurrentPage(1);\n }, [search]);\n\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.target.value);\n };\n\n const handleCreateNew = () => {\n navigate(`/plugins/${PLUGIN_ID}/embeddings`);\n };\n\n const handleSyncComplete = () => {\n // Refresh the embeddings list after sync\n fetchData(search, currentPage);\n };\n\n const headerActions = (\n <Flex gap={2}>\n <Button variant=\"secondary\" startIcon={<ArrowClockwise />} onClick={() => setIsSyncModalOpen(true)}>\n Sync\n </Button>\n <Button startIcon={<Plus />} onClick={handleCreateNew}>\n Create new embedding\n </Button>\n </Flex>\n );\n\n if (isLoading && !embeddings) {\n return (\n <Main>\n <Layouts.Header\n title={'Content Embeddings'}\n subtitle={'Manage your content embeddings'}\n primaryAction={headerActions}\n />\n <Layouts.Content>\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>Loading...</Loader>\n </Flex>\n </Layouts.Content>\n <ChatModal />\n <SyncModal\n isOpen={isSyncModalOpen}\n onClose={() => setIsSyncModalOpen(false)}\n onSyncComplete={handleSyncComplete}\n />\n </Main>\n );\n }\n\n if (embeddings?.totalCount === 0 && !search) {\n return (\n <Main>\n <Layouts.Header\n title={'Content Embeddings'}\n subtitle={'Manage your content embeddings'}\n primaryAction={headerActions}\n />\n <Layouts.Content>\n <EmptyState />\n </Layouts.Content>\n <ChatModal />\n <SyncModal\n isOpen={isSyncModalOpen}\n onClose={() => setIsSyncModalOpen(false)}\n onSyncComplete={handleSyncComplete}\n />\n </Main>\n );\n }\n\n // Render embeddings content based on loading state and data\n const renderEmbeddingsContent = () => {\n if (isLoading) {\n return (\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>Loading...</Loader>\n </Flex>\n );\n }\n\n if (embeddings?.data && embeddings.data.length > 0) {\n return <EmbeddingsTable data={embeddings.data} />;\n }\n\n return (\n <Box padding={8} textAlign=\"center\">\n No embeddings found matching \"{search}\"\n </Box>\n );\n };\n\n // Check if pagination should be shown\n const shouldShowPagination = embeddings && embeddings.totalCount > 0 && totalPages > 1;\n\n // Get visible page numbers for pagination\n const getVisiblePages = (): number[] => {\n const pages: number[] = [];\n const maxVisible = 5;\n\n let start = Math.max(1, currentPage - Math.floor(maxVisible / 2));\n const end = Math.min(totalPages, start + maxVisible - 1);\n\n if (end - start + 1 < maxVisible) {\n start = Math.max(1, end - maxVisible + 1);\n }\n\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n return pages;\n };\n\n // Render pagination info and controls\n const renderPagination = () => {\n if (!shouldShowPagination || !embeddings) {\n return null;\n }\n\n const startItem = (currentPage - 1) * PAGE_SIZE + 1;\n const endItem = Math.min(currentPage * PAGE_SIZE, embeddings.totalCount);\n const visiblePages = getVisiblePages();\n\n return (\n <Flex direction=\"column\" alignItems=\"center\" gap={3} paddingTop={6}>\n <Pagination activePage={currentPage} pageCount={totalPages}>\n <PreviousLink\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n disabled={currentPage === 1}\n >\n Previous\n </PreviousLink>\n {visiblePages.map((page) => (\n <PageLink\n key={page}\n number={page}\n onClick={() => setCurrentPage(page)}\n >\n {page}\n </PageLink>\n ))}\n <NextLink\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\n disabled={currentPage === totalPages}\n >\n Next\n </NextLink>\n </Pagination>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n Showing {startItem} to {endItem} of {embeddings.totalCount} entries\n </Typography>\n </Flex>\n );\n };\n\n return (\n <Main>\n <Layouts.Header\n title={'Content Embeddings'}\n subtitle={`${embeddings?.totalCount || 0} embeddings total`}\n primaryAction={headerActions}\n />\n <Layouts.Content>\n <Box paddingBottom={4}>\n <TextInput\n placeholder=\"Search embeddings...\"\n name=\"search\"\n value={search}\n onChange={handleSearchChange}\n startAction={<Search />}\n />\n </Box>\n {renderEmbeddingsContent()}\n {renderPagination()}\n </Layouts.Content>\n <ChatModal />\n <SyncModal\n isOpen={isSyncModalOpen}\n onClose={() => setIsSyncModalOpen(false)}\n onSyncComplete={handleSyncComplete}\n />\n </Main>\n );\n}\n","import React from 'react';\nimport { Box, Field, TextInput, Textarea } from '@strapi/design-system';\nimport { MarkdownEditor } from '../custom/MarkdownEditor';\n\ninterface CreateEmbeddingsFormProps {\n onSubmit: (e: React.FormEvent<HTMLFormElement>) => void;\n isLoading: boolean;\n input: string;\n setInput: (input: string) => void;\n markdown: string;\n handleMarkdownChange: React.Dispatch<React.SetStateAction<string>>;\n metadata: string;\n setMetadata: (metadata: string) => void;\n height?: number;\n children?: React.ReactNode;\n}\n\nexport function CreateEmbeddingsForm({\n onSubmit,\n isLoading,\n input,\n setInput,\n markdown,\n handleMarkdownChange,\n metadata,\n setMetadata,\n height,\n children,\n}: CreateEmbeddingsFormProps) {\n return (\n <form onSubmit={onSubmit}>\n <fieldset disabled={isLoading} style={{ border: 'none', padding: 0, margin: 0 }}>\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Title</Field.Label>\n <TextInput\n placeholder=\"Enter a title for your embedding\"\n name=\"input\"\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setInput(e.target.value)}\n value={input}\n />\n </Field.Root>\n </Box>\n\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Content</Field.Label>\n <MarkdownEditor\n content={markdown}\n onChange={handleMarkdownChange}\n height={height}\n />\n </Field.Root>\n </Box>\n\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Metadata (JSON)</Field.Label>\n <Field.Hint>Optional JSON metadata for this embedding</Field.Hint>\n <Textarea\n placeholder='{\"category\": \"docs\", \"source\": \"manual\"}'\n name=\"metadata\"\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => setMetadata(e.target.value)}\n value={metadata}\n />\n </Field.Root>\n </Box>\n\n {children}\n </fieldset>\n </form>\n );\n}\n","import { Link } from \"@strapi/design-system\";\nimport { ArrowLeft } from \"@strapi/icons\";\nimport { NavLink } from \"react-router-dom\";\n\ninterface BackLinkProps {\n to?: string;\n}\n\nexport function BackLink({ to }: BackLinkProps) {\n if (to) {\n return (\n <Link tag={NavLink} to={to} startIcon={<ArrowLeft />}>\n Go back\n </Link>\n );\n }\n\n return (\n <Link tag={NavLink} to=\"..\" relative=\"path\" startIcon={<ArrowLeft />}>\n Go back\n </Link>\n );\n}\n\nexport default BackLink;\n","import React, { useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useIntl } from \"react-intl\";\nimport { Main, Box, Button } from \"@strapi/design-system\";\nimport { useFetchClient, Layouts } from \"@strapi/strapi/admin\";\n\nimport { PLUGIN_ID } from \"../pluginId\";\nimport { CreateEmbeddingsForm } from \"../components/forms/CreateEmbeddingForm\";\nimport { BackLink } from \"../components/custom/BackLink\";\n\nconst CHUNK_SIZE = 4000; // Content over this will be auto-chunked\n\nexport default function CreateEmbeddings() {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { post } = useFetchClient();\n\n const [isLoading, setIsLoading] = useState(false);\n const [title, setTitle] = useState(\"\");\n const [content, setContent] = useState(\"\");\n const [metadata, setMetadata] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n\n const isValid = title.trim() && content.trim();\n const contentLength = content.length;\n const willChunk = contentLength > CHUNK_SIZE;\n const estimatedChunks = willChunk ? Math.ceil(contentLength / (CHUNK_SIZE - 200)) : 1;\n\n function parseMetadata(): Record<string, any> | null {\n if (!metadata.trim()) return null;\n try {\n return JSON.parse(metadata);\n } catch {\n return null;\n }\n }\n\n async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {\n e.preventDefault();\n e.stopPropagation();\n\n if (!isValid) {\n setError(\"Please provide a title and content\");\n return;\n }\n\n // Validate metadata JSON if provided\n if (metadata.trim()) {\n const parsedMetadata = parseMetadata();\n if (parsedMetadata === null) {\n setError(\"Invalid JSON in metadata field\");\n return;\n }\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n await post(`/${PLUGIN_ID}/embeddings/create-embedding`, {\n data: {\n title: title.trim(),\n content: content.trim(),\n metadata: parseMetadata(),\n },\n });\n navigate(`/plugins/${PLUGIN_ID}`);\n } catch (err: any) {\n console.error(\"Failed to create embedding:\", err);\n setError(err.message || \"Failed to create embedding. Please try again.\");\n setIsLoading(false);\n }\n }\n\n return (\n <Main>\n <Layouts.Header\n title={formatMessage({\n id: \"CreateEmbeddings.header.title\",\n defaultMessage: \"Create Embedding\",\n })}\n subtitle={\n willChunk\n ? formatMessage(\n {\n id: \"CreateEmbeddings.header.subtitle.chunked\",\n defaultMessage: \"Content: {length} characters (will create ~{chunks} embeddings)\",\n },\n { length: contentLength, chunks: estimatedChunks }\n )\n : formatMessage(\n {\n id: \"CreateEmbeddings.header.subtitle\",\n defaultMessage: \"Content: {length} characters\",\n },\n { length: contentLength }\n )\n }\n primaryAction={\n <Button\n type=\"submit\"\n disabled={isLoading || !isValid}\n loading={isLoading}\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n const form = document.querySelector(\"form\");\n if (form) {\n form.dispatchEvent(\n new Event(\"submit\", { cancelable: true, bubbles: true })\n );\n }\n }}\n >\n {isLoading ? \"Creating...\" : \"Create Embedding\"}\n </Button>\n }\n navigationAction={<BackLink to={`/plugins/${PLUGIN_ID}`} />}\n />\n <Layouts.Content>\n <Box>\n {error && (\n <Box\n padding={4}\n marginBottom={4}\n background=\"danger100\"\n borderColor=\"danger600\"\n hasRadius\n >\n {error}\n </Box>\n )}\n <CreateEmbeddingsForm\n onSubmit={handleSubmit}\n isLoading={isLoading}\n input={title}\n setInput={setTitle}\n markdown={content}\n handleMarkdownChange={setContent}\n metadata={metadata}\n setMetadata={setMetadata}\n />\n </Box>\n </Layouts.Content>\n </Main>\n );\n}\n","import React, { useEffect, useState } from \"react\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport {\n Main,\n Box,\n Flex,\n Button,\n Typography,\n Grid,\n Dialog,\n Loader,\n Field,\n TextInput,\n Textarea,\n Badge,\n} from \"@strapi/design-system\";\nimport { Trash, Pencil, Check, Cross } from \"@strapi/icons\";\nimport { useFetchClient, Layouts, useNotification } from \"@strapi/strapi/admin\";\n\nimport { PLUGIN_ID } from \"../pluginId\";\nimport { BackLink } from \"../components/custom/BackLink\";\nimport { Markdown } from \"../components/custom/Markdown\";\nimport { MarkdownEditor } from \"../components/custom/MarkdownEditor\";\n\nconst StyledTypography = styled(Typography)`\n display: block;\n margin-bottom: 1rem;\n`;\n\nconst ChunkTab = styled.div<{ $isActive: boolean }>`\n padding: 0.5rem 1rem;\n cursor: pointer;\n border-bottom: 2px solid ${({ $isActive }) => ($isActive ? '#4945ff' : 'transparent')};\n color: ${({ $isActive }) => ($isActive ? '#4945ff' : 'inherit')};\n font-weight: ${({ $isActive }) => ($isActive ? '600' : '400')};\n white-space: nowrap;\n\n &:hover {\n color: #4945ff;\n }\n`;\n\nconst ChunkTabsContainer = styled(Flex)`\n border-bottom: 1px solid #dcdce4;\n overflow-x: auto;\n margin-bottom: 1rem;\n`;\n\ninterface EmbeddingData {\n id: number;\n documentId: string;\n title: string;\n content?: string;\n embeddingId?: string;\n embedding?: number[];\n collectionType?: string;\n fieldName?: string;\n metadata?: Record<string, any>;\n}\n\ninterface MetadataProps {\n data: EmbeddingData;\n}\n\nfunction Metadata({ data }: Readonly<MetadataProps>) {\n const metadata = {\n id: data.documentId,\n title: data.title,\n collectionType: data.collectionType || \"standalone\",\n fieldName: data.fieldName || \"content\",\n embeddingId: data.embeddingId || \"N/A\",\n vectorDimensions: data.embedding?.length || 0,\n };\n\n return (\n <Box padding={4} background=\"neutral0\" hasRadius>\n <StyledTypography variant=\"beta\">Metadata</StyledTypography>\n {Object.entries(metadata).map(([key, value]) => (\n <Box key={key} padding={1}>\n <Typography>\n <strong>{key}:</strong> {String(value)}\n </Typography>\n </Box>\n ))}\n {data.metadata && (\n <Box marginTop={4}>\n <Typography variant=\"sigma\">Custom Metadata</Typography>\n <Box padding={2} background=\"neutral100\" hasRadius marginTop={2}>\n <pre style={{ fontSize: \"12px\", margin: 0, whiteSpace: \"pre-wrap\" }}>\n {JSON.stringify(data.metadata, null, 2)}\n </pre>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n\ninterface ConfirmDeleteProps {\n onConfirm: () => void;\n isLoading: boolean;\n}\n\nfunction ConfirmDeleteEmbedding({ onConfirm, isLoading }: Readonly<ConfirmDeleteProps>) {\n return (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" startIcon={<Trash />}>\n Delete\n </Button>\n </Dialog.Trigger>\n <Dialog.Content>\n <Dialog.Header>Confirm Deletion</Dialog.Header>\n <Dialog.Body>\n <Flex direction=\"column\" alignItems=\"center\" gap={2}>\n <Typography>Are you sure you want to delete this embedding?</Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n This action cannot be undone.\n </Typography>\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Dialog.Cancel>\n <Button variant=\"tertiary\">Cancel</Button>\n </Dialog.Cancel>\n <Dialog.Action>\n <Button\n variant=\"danger\"\n onClick={onConfirm}\n startIcon={<Trash />}\n loading={isLoading}\n >\n {isLoading ? \"Deleting...\" : \"Delete\"}\n </Button>\n </Dialog.Action>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\nexport default function EmbeddingDetails() {\n const navigate = useNavigate();\n const { id } = useParams<{ id: string }>();\n const { del, get, put } = useFetchClient();\n const { toggleNotification } = useNotification();\n\n const [data, setData] = useState<EmbeddingData | null>(null);\n const [chunks, setChunks] = useState<EmbeddingData[]>([]);\n const [activeChunkIndex, setActiveChunkIndex] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n\n // Edit form state\n const [editTitle, setEditTitle] = useState(\"\");\n const [editContent, setEditContent] = useState(\"\");\n const [editMetadata, setEditMetadata] = useState(\"\");\n\n // Check if this is a chunked document\n const isChunkedDocument = chunks.length > 1;\n const activeChunk = isChunkedDocument ? chunks[activeChunkIndex] : data;\n\n useEffect(() => {\n async function fetchData() {\n if (!id) return;\n try {\n // First fetch the main embedding\n const response = await get(`/${PLUGIN_ID}/embeddings/find/${id}`);\n const embeddingData = response.data as EmbeddingData;\n setData(embeddingData);\n\n // Check if this is part of a chunked document and fetch related chunks\n const chunksResponse = await get(`/${PLUGIN_ID}/embeddings/related-chunks/${id}`);\n const relatedChunks = chunksResponse.data?.data || [];\n\n if (relatedChunks.length > 1) {\n // Sort chunks by chunkIndex\n const sortedChunks = relatedChunks.sort((a: EmbeddingData, b: EmbeddingData) => {\n const aIndex = (a.metadata as any)?.chunkIndex ?? 0;\n const bIndex = (b.metadata as any)?.chunkIndex ?? 0;\n return aIndex - bIndex;\n });\n setChunks(sortedChunks);\n\n // Find the index of the current chunk\n const currentIndex = sortedChunks.findIndex(\n (chunk: EmbeddingData) => chunk.documentId === id\n );\n if (currentIndex >= 0) {\n setActiveChunkIndex(currentIndex);\n }\n\n // Initialize edit form with first chunk\n const firstChunk = sortedChunks[currentIndex >= 0 ? currentIndex : 0];\n setEditTitle(firstChunk.title || \"\");\n setEditContent(firstChunk.content || \"\");\n setEditMetadata(firstChunk.metadata ? JSON.stringify(firstChunk.metadata, null, 2) : \"\");\n } else {\n setChunks([embeddingData]);\n // Initialize edit form\n setEditTitle(embeddingData.title || \"\");\n setEditContent(embeddingData.content || \"\");\n setEditMetadata(embeddingData.metadata ? JSON.stringify(embeddingData.metadata, null, 2) : \"\");\n }\n } catch (error) {\n console.error(\"Failed to fetch embedding:\", error);\n } finally {\n setIsLoading(false);\n }\n }\n fetchData();\n }, [id, get]);\n\n // Update edit form when active chunk changes\n useEffect(() => {\n if (activeChunk && !isEditing) {\n setEditTitle(activeChunk.title || \"\");\n setEditContent(activeChunk.content || \"\");\n setEditMetadata(activeChunk.metadata ? JSON.stringify(activeChunk.metadata, null, 2) : \"\");\n }\n }, [activeChunkIndex, activeChunk, isEditing]);\n\n const handleDelete = async () => {\n if (!activeChunk || isDeleting) return;\n setIsDeleting(true);\n try {\n // If chunked document, delete all chunks\n if (isChunkedDocument) {\n for (const chunk of chunks) {\n await del(`/${PLUGIN_ID}/embeddings/delete-embedding/${chunk.documentId}`);\n }\n } else {\n await del(`/${PLUGIN_ID}/embeddings/delete-embedding/${activeChunk.documentId}`);\n }\n navigate(`/plugins/${PLUGIN_ID}`);\n } catch (error) {\n console.error(\"Failed to delete embedding:\", error);\n setIsDeleting(false);\n }\n };\n\n const handleStartEdit = () => {\n if (activeChunk) {\n setEditTitle(activeChunk.title || \"\");\n setEditContent(activeChunk.content || \"\");\n setEditMetadata(activeChunk.metadata ? JSON.stringify(activeChunk.metadata, null, 2) : \"\");\n }\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setIsEditing(false);\n // Reset to current chunk values\n if (activeChunk) {\n setEditTitle(activeChunk.title || \"\");\n setEditContent(activeChunk.content || \"\");\n setEditMetadata(activeChunk.metadata ? JSON.stringify(activeChunk.metadata, null, 2) : \"\");\n }\n };\n\n const handleSave = async () => {\n if (!activeChunk || isSaving) return;\n\n // Validate metadata JSON if provided\n let parsedMetadata = null;\n if (editMetadata.trim()) {\n try {\n parsedMetadata = JSON.parse(editMetadata);\n } catch {\n toggleNotification({\n type: \"warning\",\n message: \"Invalid JSON in metadata field\",\n });\n return;\n }\n }\n\n setIsSaving(true);\n try {\n const response = await put(`/${PLUGIN_ID}/embeddings/update-embedding/${activeChunk.documentId}`, {\n data: {\n title: editTitle.trim(),\n content: editContent.trim(),\n metadata: parsedMetadata,\n },\n });\n\n const updatedData = response.data as EmbeddingData;\n\n // Update the chunk in the chunks array\n if (isChunkedDocument) {\n const newChunks = [...chunks];\n newChunks[activeChunkIndex] = updatedData;\n setChunks(newChunks);\n } else {\n setData(updatedData);\n setChunks([updatedData]);\n }\n\n setIsEditing(false);\n toggleNotification({\n type: \"success\",\n message: \"Chunk updated successfully\",\n });\n } catch (error: any) {\n console.error(\"Failed to update embedding:\", error);\n toggleNotification({\n type: \"danger\",\n message: error.message || \"Failed to update embedding\",\n });\n } finally {\n setIsSaving(false);\n }\n };\n\n const handleChunkSelect = (index: number) => {\n if (isEditing) {\n // Warn user about unsaved changes\n const confirmed = globalThis.confirm(\"You have unsaved changes. Discard them?\");\n if (!confirmed) return;\n setIsEditing(false);\n }\n setActiveChunkIndex(index);\n };\n\n const getOriginalTitle = () => {\n if (isChunkedDocument && chunks[0]?.metadata) {\n return (chunks[0].metadata as any).originalTitle || chunks[0].title?.replace(/\\s*\\[Part \\d+\\/\\d+\\]$/, '');\n }\n return data?.title || \"Embedding Details\";\n };\n\n if (isLoading) {\n return (\n <Main>\n <Layouts.Header\n title=\"Loading...\"\n navigationAction={<BackLink to={`/plugins/${PLUGIN_ID}`} />}\n />\n <Layouts.Content>\n <Flex justifyContent=\"center\" padding={8}>\n <Loader>Loading embedding details...</Loader>\n </Flex>\n </Layouts.Content>\n </Main>\n );\n }\n\n if (!data || !activeChunk) {\n return (\n <Main>\n <Layouts.Header\n title=\"Embedding Not Found\"\n navigationAction={<BackLink to={`/plugins/${PLUGIN_ID}`} />}\n />\n <Layouts.Content>\n <Box padding={8} textAlign=\"center\">\n <Typography>The requested embedding could not be found.</Typography>\n </Box>\n </Layouts.Content>\n </Main>\n );\n }\n\n const headerTitle = isEditing\n ? `Edit: ${activeChunk.title}`\n : isChunkedDocument\n ? getOriginalTitle()\n : (data.title || \"Embedding Details\");\n\n const headerSubtitle = isChunkedDocument\n ? `Chunked Document (${chunks.length} parts)`\n : `Embedding ID: ${data.embeddingId || \"N/A\"}`;\n\n return (\n <Main>\n <Layouts.Header\n title={headerTitle}\n subtitle={headerSubtitle}\n primaryAction={\n isEditing ? (\n <Flex gap={2}>\n <Button variant=\"tertiary\" startIcon={<Cross />} onClick={handleCancelEdit}>\n Cancel\n </Button>\n <Button startIcon={<Check />} onClick={handleSave} loading={isSaving}>\n {isSaving ? \"Saving...\" : \"Save Chunk\"}\n </Button>\n </Flex>\n ) : (\n <Flex gap={2}>\n <Button variant=\"secondary\" startIcon={<Pencil />} onClick={handleStartEdit}>\n Edit {isChunkedDocument ? \"Chunk\" : \"\"}\n </Button>\n <ConfirmDeleteEmbedding onConfirm={handleDelete} isLoading={isDeleting} />\n </Flex>\n )\n }\n navigationAction={<BackLink to={`/plugins/${PLUGIN_ID}`} />}\n />\n <Layouts.Content>\n <Box padding={8}>\n {/* Chunk tabs for chunked documents */}\n {isChunkedDocument && (\n <Box marginBottom={4}>\n <Box background=\"neutral0\" padding={4} hasRadius>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3}>\n <Typography variant=\"beta\">Document Chunks</Typography>\n <Badge>{chunks.length} parts</Badge>\n </Flex>\n <ChunkTabsContainer gap={0}>\n {chunks.map((chunk, index) => (\n <ChunkTab\n key={chunk.documentId}\n $isActive={index === activeChunkIndex}\n onClick={() => handleChunkSelect(index)}\n >\n Part {index + 1}\n {index === activeChunkIndex && isEditing && \" (editing)\"}\n </ChunkTab>\n ))}\n </ChunkTabsContainer>\n </Box>\n </Box>\n )}\n\n {isEditing ? (\n <Grid.Root gap={6}>\n <Grid.Item col={8} s={12}>\n <Box background=\"neutral100\" padding={1} hasRadius>\n <Box padding={4} background=\"neutral0\" hasRadius>\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Title</Field.Label>\n <TextInput\n value={editTitle}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditTitle(e.target.value)\n }\n />\n </Field.Root>\n </Box>\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Content</Field.Label>\n <Field.Hint>\n Changes to content will regenerate the embedding vector\n </Field.Hint>\n </Field.Root>\n <MarkdownEditor\n content={editContent}\n onChange={setEditContent}\n height={300}\n />\n </Box>\n </Box>\n </Box>\n </Grid.Item>\n <Grid.Item col={4} s={12}>\n <Box background=\"neutral100\" padding={1} hasRadius>\n <Box padding={4} background=\"neutral0\" hasRadius>\n <Box marginBottom={4}>\n <Field.Root>\n <Field.Label>Metadata (JSON)</Field.Label>\n <Field.Hint>Optional custom metadata</Field.Hint>\n <Textarea\n value={editMetadata}\n onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>\n setEditMetadata(e.target.value)\n }\n placeholder='{\"key\": \"value\"}'\n />\n </Field.Root>\n </Box>\n </Box>\n </Box>\n </Grid.Item>\n </Grid.Root>\n ) : (\n <Grid.Root gap={6}>\n <Grid.Item col={8} s={12}>\n <Box background=\"neutral100\" padding={1} hasRadius>\n <Box padding={4} background=\"neutral0\" hasRadius>\n <Flex justifyContent=\"space-between\" alignItems=\"center\" marginBottom={3}>\n <StyledTypography variant=\"beta\" style={{ margin: 0 }}>\n {isChunkedDocument ? `Part ${activeChunkIndex + 1} Content` : \"Embedding Content\"}\n </StyledTypography>\n {isChunkedDocument && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {activeChunk.content?.length || 0} characters\n </Typography>\n )}\n </Flex>\n {activeChunk.content ? (\n <Markdown>{activeChunk.content}</Markdown>\n ) : (\n <Typography textColor=\"neutral600\">No content</Typography>\n )}\n </Box>\n </Box>\n </Grid.Item>\n <Grid.Item col={4} s={12}>\n <Box background=\"neutral100\" padding={1} hasRadius>\n <Metadata data={activeChunk} />\n </Box>\n </Grid.Item>\n </Grid.Root>\n )}\n </Box>\n </Layouts.Content>\n </Main>\n );\n}\n","import { Page } from '@strapi/strapi/admin';\nimport { Routes, Route } from 'react-router-dom';\n\nimport { HomePage } from './HomePage';\nimport CreateEmbeddings from './CreateEmbeddings';\nimport EmbeddingDetails from './EmbeddingDetails';\n\nconst App = () => {\n return (\n <Routes>\n <Route index element={<HomePage />} />\n <Route path=\"*\" element={<Page.Error />} />\n <Route path=\"/embeddings\" element={<CreateEmbeddings />} />\n <Route path=\"/embeddings/:id\" element={<EmbeddingDetails />} />\n </Routes>\n );\n};\n\nexport { App };\n"],"names":["Link"],"mappings":"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"}
|